Может ли шаблонный вложенный класс C ++ наследовать включающий его класс? - PullRequest
2 голосов
/ 01 ноября 2011

Этот вопрос очень тесно связан с Может ли вложенный класс 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;

Можно ли заставить что-то подобное работать?

Ответы [ 3 ]

3 голосов
/ 01 ноября 2011

Другой ответ работает, вам просто нужно знать синтаксис для него:

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
{
    ....
};
1 голос
/ 01 ноября 2011

Конечно, можно.Как и предлагалось в исходном вопросе, просто используйте предварительное объявление.

#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

0 голосов
/ 01 ноября 2011

Вы не можете сделать это, потому что для наследования требуется полное определение класса.Поскольку использование Bear и Giraffe в Animal может повлиять на определение Animal, вы получите почти круговую зависимость.

Вместо этого сгруппируйте связанные классы в пространстве имен.Я не вижу причин, почему конкретные животные должны быть вложены в Animal вообще.

...