模板继承自模板,但编译器抱怨未从基本模板声明标识符

时间:2013-09-12 07:57:08

标签: c++ templates gcc c++11

我有以下情况:

template <class A, typename B, typename C, class D>
class Base
{
    public:
       // ctor and virtual dtor
       // functions
       class Inner
       {
           //...
       };

    protected:
       // members
};

template <class E>
class Sub : public Base<std::string, float, double, E>
{
    public:
       // ctor and virtual dtor

       // functions using Inner class inherit from Base
};

虽然msvc编译得很好(使用ctp nov 2012编译器的visual studio 2012),gcc(来自trunk的4.9.0版本)会抱怨从Base使用的每个成员以及Base中的内部类。

我注意到msvc在模板方面相当宽松,但是我还需要运行这个代码并在linux下用gcc编译。那么,msvc接受的伪代码在哪里但gcc不是?

1 个答案:

答案 0 :(得分:2)

核心问题是,不依赖于模板参数的名称会在声明中查找,而不是实例化时间。使用例如Base<std::string, float, double, E>::Inner而非Inner,或在您的班级中添加使用声明:using Base<std::string, float, double, E>::Inner。这将使名称依赖,从而查看实例化时间。

有关详细信息,请搜索“依赖名称查找”。