1

我有以下情况:

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)抱怨从 Base 使用的每个成员以及来自 Base 的内部类。

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

4

1 回答 1

2

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

For more info, search for "dependent name lookup."

于 2013-09-12T08:02:44.753 回答