2

テンプレート引数が継承クラス内のネストされたクラスであるテンプレートクラスから継承する適切な方法は何ですか?

class SomeClass : public TemplateClass<NestedClass>
{
     class NestedClass {};
};
4

3 に答える 3

4

それを具体的に行う方法はありません。本当に から継承する必要がある場合は、宣言TemplateClass<NestedClass>を から移動する必要があります。NestedClassSomeClass

于 2009-11-11T00:31:24.493 に答える
0

どうすればこれを適切に行うことができるかわかりません。これがあります:

template<class T> class TemplateClass {};

class NestedClass {};

class SomeClass : public TemplateClass<NestedClass>
{
    typedef NestedClass NestedClass;
};

しかし、それはただの偽装です...

于 2009-11-11T09:25:01.860 に答える
-1

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の回答がこの問題を最もよく解決すると思います。

于 2009-11-11T05:30:13.860 に答える