【问题标题】:Error with construction, unable to find object when calling its method?构造错误,调用其方法时找不到对象?
【发布时间】:2015-05-19 21:09:15
【问题描述】:

我在下面创建了一些玩具类。编译的时候,好像编译器构造对象有问题,但是调用对象的方法就报错了。

我尝试使用 MSVC10 和 gcc 4.9 进行编译,相应的错误消息是:

  • MSVC10:错误 C2228:左侧“.get”必须具有类/结构/联合
  • g++ 4.9:错误:在“test”中请求成员“get”,它属于非类类型“TestClass(DataContainer)”

有什么问题?谢谢!

    #include <iostream>
    using namespace std;

    template <class T>
    class Data
    {
    public:
        Data(T i) : d(i) 
        {}

        T get() const {
            return d;
        }

    protected:
        T d;
    };

    class DataContainer
    {
    public:
        DataContainer(const Data<int>& i) : d(i)
        {}

        const int get() const {
            return d.get();
        }

    protected:
        Data<int> d;
    };

    class TestClass
    {
    public:
        TestClass(const DataContainer& a) : d(a)
        {}

        int get() {
            return d.get();
        }

    protected:
        DataContainer d;
    };


    int main()
    {
        Data<int> a(100);
        TestClass test(DataContainer(a));
        std::cout << test.get() << std::endl; 
        return 0;
    }

然而,这编译成功。

    int main()
    {
        Data<int> a(100);
        DataContainer cont(a);
        TestClass test(cont);
        std::cout << test.get() << std::endl; 
        return 0;
    }

【问题讨论】:

    标签: c++ visual-c++ constructor g++ rvalue


    【解决方案1】:

    看起来像most vexing parse。编译器认为您是在声明一个函数而不是一个对象。这也有效:

    int main()
    {
        Data<int> a(100);
        TestClass test = TestClass(DataContainer(a));
        std::cout << test.get() << std::endl; 
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2021-06-04
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多