这个问题与Can a nested C++ class inherit its enclosing class?
密切相关我的情况很复杂,模板似乎意味着先前的answer不再有效。
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 :(得分: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
{
....
};
答案 1 :(得分: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 :(得分:0)
您不能这样做,因为继承要求完整的类定义可用。由于Bear
和Giraffe
在Animal
内的使用可能会影响动物的定义,因此您几乎可以使用循环依赖。
而是将命名空间中的相关类分组。我认为没有理由将特定动物嵌套在Animal
内。