以下程序用 g++ 4.6 编译,产生错误
request for member ‘y’ in ‘a2’, which is of non-class type ‘A<B>(B)’
在最后一行:
#include <iostream>
template <class T> class A
{
public:
T y;
A(T x):y(x){}
};
class B
{
public:
int u;
B(int v):u(v){}
};
int main()
{
int v = 10;
B b1(v);
//works
A<B> a1(b1);
//does not work (the error is when a2 is used)
A<B> a2(B(v));
//works
//A<B> a2((B(v)));
std::cout << a1.y.u << " " << a2.y.u << std::endl;
}
从代码中包含的工作变体可以看出,在 A 的构造函数的参数周围添加括号可以解决问题。
我已经看到由于将构造函数调用解释为函数声明而导致的一些相关错误,例如在创建一个没有构造函数参数但带有大括号的对象时:
myclass myobj();
但在我看来
A<B> a2(B(v));
不能解释为函数声明。
有人可以向我解释发生了什么吗?