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));
関数宣言として解釈できません。
誰かが私に何が起こっているのか説明できますか?