テンプレート化されたクラス Foo があります。
template <class A, class B>
class Foo
{
public:
Foo(A &aInstance);
private:
Attr<Foo> _attr;
};
次に、Foo クラスの属性であり、テンプレート パラメーターとして Foo クラス自体を取る Attr という別のテンプレート クラスがあります。
template <class C>
class Attr
{
class SomeType
{
SomeType();
~SomeType();
};
Attr(const SomeType* st);
~Attr();
private:
Attr();
}
テンプレートの最初のパラメーターを SomeType としてキャストして、コンストラクターで (Attr 型の) _attr を初期化したい。
Foo コンストラクターの実装:
template<class A, class B>
Foo<A, B>::Foo(A &aInstance):
_attr(
(Attr<Foo<A, B> >::SomeType *) aInstance)
{
}
これはコンパイルされません:
エラー: ')' トークンの前にプライマリ式が必要です
そのエラーは、SomeType が認識されなかったかのように、Foo コンストラクター実装のキャスト行を参照しています。
インスタンスができましたが、それでも同じエラーが発生します。