私は次のコードを手に入れました(それが意味があるかどうかについて議論しないでください、それは単なる最小限の例です):
struct X{
template <typename T>
T foo(){ return T(); }
};
template <typename T>
struct Z{
virtual X bar(){
bar().foo<int>();
return X();
}
};
私のg++4.6.3ではコンパイルされません。この行bar().foo<int>();
には次のエラーが表示されます。
error: expected primary-expression before ‘int’
error: expected ‘;’ before ‘int’
最初にbar()の結果をローカル変数に保存すると、それは機能しますbar().foo<int>()
。
X x = bar();
x.foo<int>();
その後、それは動作します。auto
の代わりにローカル変数を宣言すると、次のようになりますX
。
auto x = bar();
x.foo<int>();
その後、以前と同じエラーが発生します。クラスZからtypeパラメーターを削除すると(つまり、テンプレートクラスではなく通常のクラスにする)、再び機能します。
fooのタイプパラメータとしてX
ではなくのようなクラスタイプを使用すると、代わりに次のエラーが発生します。int
foo<X>
expected primary-expression before ‘>’ token
expected primary-expression before ‘)’ token
ここでエラーを見つけることはできません。助けてください!