2011-02-02 178 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