2011-02-02 102 views
-1
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 
     } 
    }; 

}; 
+2

这充满了语法错误。 – sth 2011-02-02 04:23:27

+0

对不起,我只是从我的代码简化。 – Sean 2011-02-02 04:25:27

+3

请复制并粘贴您的*真实*代码。你显然已经省略了很多代码,并且在确定究竟出了什么问题时,你所遗漏的一些代码可能很重要。创建一个编译的小例子(或者你认为*应该*编译)并且仍然演示这个问题。 – 2011-02-02 04:25:54

回答

3

C++ 03 [14.6节/ 8]表示

当寻找一个名称的模板中的定义中使用的声明,通常的查找规则(3.4.1,3.4.2)被用于为非独立的名字。将依赖于模板参数的名称查找推迟到实际模板参数已知(14.6.2)。

第14.6.2/3说

在一类模板或模板类中的成员的定义,如果一个基类类模板的依赖于模板的参数,所述在类模板或成员的定义点或在类模板或成员的实例化过程中,不检查基类的范围。

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

所以你有两个选择。

  • 采用全会员即base<T>::nestedClass::pos
  • 使用this->pos合格的名称。
1

它已被明确为基础参考:: nestedClass :: POS [或使用using语句]

1

你不把POS进入活动范围。您可以使用this->pos += 5;using nestedclass::pos