构造错误,调用其方法时找不到对象?
Error with construction, unable to find object when calling its method?
我在下面制作了一些玩具 classes。在编译过程中,编译器似乎在构造对象时出现了一些问题,但在调用对象的方法时却抛出了错误。
我试过使用 MSVC10 和 gcc 4.9 进行编译,相应的错误消息是:
- MSVC10: error C2228: left '.get' must have class/struct/union
- g++ 4.9:错误:请求 'test' 中的成员 'get',属于非 class 类型 '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;
}
看起来像 most vexing parse。编译器认为您正在声明一个函数而不是一个对象。这也有效:
int main()
{
Data<int> a(100);
TestClass test = TestClass(DataContainer(a));
std::cout << test.get() << std::endl;
return 0;
}
我在下面制作了一些玩具 classes。在编译过程中,编译器似乎在构造对象时出现了一些问题,但在调用对象的方法时却抛出了错误。
我试过使用 MSVC10 和 gcc 4.9 进行编译,相应的错误消息是:
- MSVC10: error C2228: left '.get' must have class/struct/union
- g++ 4.9:错误:请求 'test' 中的成员 'get',属于非 class 类型 '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;
}
看起来像 most vexing parse。编译器认为您正在声明一个函数而不是一个对象。这也有效:
int main()
{
Data<int> a(100);
TestClass test = TestClass(DataContainer(a));
std::cout << test.get() << std::endl;
return 0;
}