模板来自模板,但编译器抱怨未从基本模板中清除标识符

Template intherit from template but compiler complains about not decleared identifiers from base template

本文关键字:标识符 清除 编译器      更新时间:2023-10-16

我有以下情况:

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 编译得很好(Visual Studio 2012 with ctp nov 2012 编译器),但 gcc(从 Trunk 构建的 4.9.0)抱怨从 Base 使用的每个成员以及来自 Base 的内部类。

我注意到 msvc 在模板方面非常放松,但是我还需要在带有 gcc 的 Linux 下运行和编译这段代码。那么,msvc 接受但 gcc 不接受的虚假代码在哪里?

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

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