【问题标题】:Template intherit from template but compiler complains about not decleared identifiers from base template [duplicate]模板从模板继承,但编译器抱怨未从基本模板声明标识符[重复]
【发布时间】:2013-09-12 07:57:08
【问题描述】:

我有以下情况:

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 在模板方面非常轻松,但是我还需要在 linux 下使用 gcc 运行和编译这段代码。那么,msvc 接受但 gcc 不接受的伪代码在哪里?

【问题讨论】:

  • 这可能是一个从属名称问题。您可能需要指定Base::theMethodName()this-&gt;theMethodName()。但是你应该至少包含一个导致错误的行。
  • 请提供SSCCE猜测:你可能需要一些typename
  • 您是否尝试使用g++ -c 编译您的sn-p 并且确实失败了?因为它在 g++ 4.8 中编译得很好

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多