2012-07-05 47 views
0

私有變量我從下面的程序出現以下錯誤:使用的朋友來訪問模板類

使用未聲明的標識符「價值」

爲什麼呢?而且,如何使用朋友課程修復它?

在此先感謝。

template <typename T> 
class F2 : public F1<T> 
{ 
public: 
    F2(T o) : F1<T>(o) {} 

    void fun() { 
    std::cout << value << std::endl; 
    } 
}; 

template <typename T> 
class F1 
{ 
public: 
    template <typename U> 
    friend class F2; 

    F1(T o) : value(o) {} 

protected: 
    T value; 
}; 

int main() 
{ 
    F2<int> f(3); 
} 
+0

這是你的實際代碼? 'F2'從你的代碼示例中的**後面的'F1'派生而來。 – 2012-07-05 23:35:27

+0

是的,否則它會抱怨朋友不是精心製作的類型。 – 2012-07-05 23:44:13

+0

@NiallC:推測上面有一個前向聲明。只有在模板被使用後才能使用body(在main()'內部命名'F2 ') – 2012-07-06 00:20:19

回答

2

C++標準規定,即不依賴於模板參數的所有名稱解析模板函數時被約束,而不是當它被實例化,這是否則當可檢測到繼承的value參考。

快速解決方法是使用this->value;因爲this依賴於在實例化函數時綁定的模板參數,因此允許對繼承的value的引用。

+0

我注意到了一些例子,是「這個」的無關用途。我現在知道他們爲什麼在那裏。謝謝。 – 2012-07-06 00:05:06

0

這裏有多種問題:

1)F2沒有模板,讓你在使用TF2是不正確

2)F1(基類)的F2之後定義隨處可見,將F2設置爲低於F1

3)基類正在友愛它的派生類。它不應該知道它的派生類。

這是你的實際的號碼?如果是的話,你寫的你的錯誤實際錯誤?由於一系列原因,我會期待大量的錯誤。

+0

我沒有注意到,但我錯過了第一行是模板 2012-07-06 00:02:51