テンプレート引数が継承クラス内のネストされたクラスであるテンプレートクラスから継承する適切な方法は何ですか?
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass {};
};
テンプレート引数が継承クラス内のネストされたクラスであるテンプレートクラスから継承する適切な方法は何ですか?
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass {};
};
それを具体的に行う方法はありません。本当に から継承する必要がある場合は、宣言TemplateClass<NestedClass>
を から移動する必要があります。NestedClass
SomeClass
どうすればこれを適切に行うことができるかわかりません。これがあります:
template<class T> class TemplateClass {};
class NestedClass {};
class SomeClass : public TemplateClass<NestedClass>
{
typedef NestedClass NestedClass;
};
しかし、それはただの偽装です...
NestedClass を少なくとも前方宣言する必要があります。
class NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass{};
};
これは機能します。Windows 上の MinGW c++ でテスト済み。
更新: @jon Windows XP で gcc バージョン 3.4.5 を使用して次のことを試しました。
#include <iostream>
class NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<NestedClass>
{
public:
class NestedClass{
public:
int a;
static int test(){ return 100; }
};
NestedClass nc;
};
int main(){
SomeClass sc;
sc.nc.a = 10;
std::cout<< sc.nc.a << std::endl;
std::cout<< sc.nc.test() << std::endl;
}
そして、次の出力が得られます: 10 100
しかし、著者が意図したことは(@jonが示唆したように)実際にはこれだと思います:
class SomeClass::NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<SomeClass::NestedClass>
{
public:
class NestedClass{};
NestedClass nc;
};
そして、これは機能しません。テンプレート仕様で SomeClass::NestedClass を宣言できるようにするには、 SomeClass を宣言する必要があるためです。しかし、私たちはまさにそれをやろうとしています - したがって、循環的な依存関係が発生します。
したがって、@ jonの回答がこの問題を最もよく解決すると思います。