构造出错,调用方法时无法找到对象?

时间:2015-05-19 21:09:15

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

我在下面创建了几个玩具类。在编译期间,似乎编译器在构造对象时遇到一些问题,但在调用对象的方法时会抛出错误。

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

  • MSVC10:错误C2228:离开' .get'必须有class / struct / union
  • g ++ 4.9:错误:会员请求' get' in' test',这是非类型的' 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;
    }

1 个答案:

答案 0 :(得分:3)

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

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