2011-11-01 50 views
2

这个问题非常密切相关Can a nested C++ class inherit its enclosing class?模板嵌套的C++类是否可以继承它的封闭类?

我的形势错综复杂,模板,似乎意味着以前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

你有没有尝试过他们在你提到的问题中回答什么?我不明白为什么使用模板会改变任何东西。 – 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'是'Animal'。 – 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

我想你在这里有两个不同的'熊'类和两个'长颈鹿'类。那些工作不是嵌套的。 – paperjam

+0

根据您的示例重新编写代码,它工作得很好。 – astevanovic

0

你不能这样做,因为传承需要完整的类定义可用。由于BearGiraffeAnimal内的使用可能会影响Animal的定义,因此您几乎可以通过循环依赖来解决。

相反,将相关类分组到一个名称空间中。我没有看到为什么特定的动物应该嵌套在Animal之内。

+0

我的真实代码没有'动物'。我使用CRTP,并且将模板化的派生类嵌套在其基类之一中非常干净和方便。 – paperjam