2011-11-01 12 views
2

この質問は、私の状況は、一見、前answerはもはや機能していることを意味していないテンプレートを合併しているCan a nested C++ class inherit its enclosing class?テンプレートのネストされたC++クラスは、その囲むクラスを継承できますか?

に非常に密接に関係します。

class Animal 
{ 
    template <typename T> 
    class Bear : public Animal 
    { 
     // … 
    }; 

    template <typename T> 
    class Giraffe : public Animal 
    { 
     // … 
    }; 
}; 

// example usage 

struct MyAnimal : Animal::Bear<Animal> { }; 

MyAnimal a; 

このようなことはできますか?

+0

あなたが言った質問で答えたことをやってみましたか?なぜテンプレートを使って何かが変わるのはわかりません。 – mb14

答えて

3

他の回答の作品は、あなたはそれのための構文を知っておく必要があります。それができる

class Animal 
{ 
    template <typename T> 
    class Bear; 

    template <typename T> 
    class Giraffe; 
}; 

template <typename T> 
class Animal::Bear : public Animal 
{ 
    .... 
}; 

template <typename T> 
class Animal::Giraffe : public Animal 
{ 
    .... 
}; 
+0

これは機能しません。私のコンパイラ(VS2010)は 'Animal :: Bear 'が定義されていないと不平を言います。私は後でそれをCRTPスタイルの別のテンプレートクラスの基本クラスとして使用しています。 'T'は'動物 'です。 – paperjam

+0

問題の最小例を投稿してください。これはあなたが尋ねた質問に対する解決策です。 – tenfour

+0

@paperjam:このソリューションはgcc 4.6.1でうまくコンパイルされています。 – thiton

1

確かに。元の質問で提案されているように、単に前方宣言を使用します。

#include <iostream> 

class Animal 
{ 
public: 
    template <typename T> 
    class Bear; 

    template <typename T> 
    class Giraffe; 

    int val; 
}; 

template <typename T> 
class Animal::Bear : public Animal 
{ 
    public: 
    T b_member; 

    virtual void print(){ 
     std::cout << b_member.val << endl; 
    } 

}; 

template <typename T> 
class Animal::Giraffe : public Animal 
{ 
    public: 
    T g_member; 

    virtual void print(){ 
     std::cout << g_member.val << endl; 
    } 
}; 

struct BearAnimal : Animal::Bear<Animal> 
{ 
}; 

struct GiraffeAnimal : Animal::Giraffe <Animal> 
{ 
}; 


int main() 
{ 
    BearAnimal btest; 
    GiraffeAnimal gtest; 
    btest.b_member.val = 1; 
    gtest.g_member.val = 2; 
    btest.print(); 
    gtest.print();  

    return 0; 
} 

出力:

+1

ここには2つの異なるクマのクラスと2つの「キリン」クラスがあります。動作するものはネストされていません。 – paperjam

+0

あなたの例に従ってコードをRedidしても問題ありません。 – astevanovic

0

継承が利用できるように、完全なクラス定義を必要とするため、あなたはそれを行うことはできません。 BearGiraffeの使用がAnimalの場合、Animalの定義に影響を与える可能性があります。

代わりに、関連するクラスを名前空間にグループ化します。私は特定の動物がAnimalの中に入れ子にされるべき理由は全く見ません。

+0

私の実際のコードには「動物」はありません。私はCRTPを使用しています。テンプレートベースの派生クラスを基本クラスの1つにネストするのは非常にクリーンで便利です。 – paperjam

関連する問題