c++ - 模板继承自模板,但编译器提示未从基本模板声明标识符

标签 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(4.9.0 从 trunk 构建)提示从 Base 使用的每个成员以及 Base 的内部类。

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

最佳答案

核心问题是不依赖于模板参数的名称是在声明时查找的,而不是实例化时。使用例如Base<std::string, float, double, E>::Inner而不仅仅是 Inner , 或者在你的类中放置一个 using 声明:using Base<std::string, float, double, E>::Inner .这将使名称依赖并因此在实例化时查找。

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

关于c++ - 模板继承自模板,但编译器提示未从基本模板声明标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18758628/

相关文章:

c++ - int main = 0,已编译但崩溃

c++ - C++ API 缺少修改方法

c++ - 另一个类中的类的构造函数问题

c++ - "X is not a member of Y"即使 X 是 Y 的 friend ?

c++ - 在非静态成员函数中使用时,非静态成员的名称是否依赖?

c - 如何消除结构中未使用的元素?

大型数组的 C# 内存优化

c++ - 计算数组的不同元素

c++ - 理解c++中模板的问题

控制台输出以错误的顺序出现