【问题标题】:nested class inheritance [closed]嵌套类继承
【发布时间】:2011-06-19 17:39:37
【问题描述】:
template<class T>
class base
{
    class nestedClass
    {
       T pos;
    };
   class derivedClass:public base<T>::nestedClass
     {
       void fun(){
         pos = pos +5; // error: pos is not declared in this scope
        }
     };   

};

【问题讨论】:

  • 这充满了语法错误。
  • 对不起,我只是简化了我的代码。
  • 请复制并粘贴您的真实代码。您显然省略了很多代码,而您遗漏的一些代码可能对于确定到底哪里出了问题很重要。创建一个可以编译(或您认为应该编译)并且仍然演示问题的最小示例。
  • 肖恩,谢谢你粘贴真实的代码,但我说的是一个minimal的例子。重现“未在此范围内声明”错误消息所需的代码方式 多。事实上,看起来这段代码甚至没有表现出与您开始时相同的问题。在人们已经开始回答之后,请不要改变问题的目标。它把旧的答案变成了废话。

标签: c++ templates class nested


【解决方案1】:

它必须被显式引用为 base::nestedClass::pos [或使用 using 语句]

【讨论】:

【解决方案2】:

您没有将 pos 纳入范围。您可以使用this-&gt;pos += 5;using nestedclass::pos

【讨论】:

  • @Prasoon: 是的......当你的评论弹出时修复它。
【解决方案3】:

C++03 [第 14.6/8 节] 说

在查找模板定义中使用的名称声明时,通常的查找规则(3.4.1、3.4.2)用于非依赖名称。依赖于模板参数的名称查找被推迟到知道实际的模板参数 (14.6.2)。

第 14.6.2/3 节说

在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则在定义点的非限定名称查找期间不会检查基类范围类模板或成员,或在类模板或成员的实例化期间。

pos 是一个非依赖名称,因此不会检查基类。

所以你有两个选择。

  • 使用会员的完全限定名,即base&lt;T&gt;::nestedClass::pos
  • 使用this-&gt;pos

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多