2016-02-15 41 views
3

操作系統:Windows 8.1爲什麼編譯器在範圍中看不到變量?

編譯器:GNU C++

我有兩個模板類:基類和派生。在基類中,我聲明變量value。當我嘗試從派生類的方法申請到value時,編譯器向我報告錯誤。 但是,如果我不使用模板,我不會收到錯誤消息。

有錯誤消息:

main.cpp: In member function 'void Second<T>::setValue(const T&)': 
main.cpp:17:3: error: 'value' was not declared in this scope 
    value = val; 
^

有代碼:

#include <iostream> 

using namespace std; 

template<class T> 
class First { 
public: 
    T value; 
    First() {} 
}; 

template<class T> 
class Second : public First<T> { 
    public: 
    Second() {} 
    void setValue(const T& val) { 
     value = val; 
    } 
}; 

int main() { 
    Second<int> x; 
    x.setValue(10); 
    cout << x.value << endl; 
    return 0; 
} 

此代碼的工作:

#include <iostream> 

using namespace std; 

class First { 
public: 
    int value; 
    First() {} 
}; 

class Second : public First { 
public: 
    Second() {} 
    void setValue(const int& val) { 
     value = val; 
    } 
}; 

int main() { 
    Second x; 
    x.setValue(10); 
    cout << x.value << endl; 
    return 0; 
} 
+2

不合格查找不查看依賴基類。必須有一個巨大的複製品在那裏... –

+0

適用於VS2015。當您將'value = val;'更改爲'First :: value = val;'時,它也可以工作。 (http://coliru.stacked-crooked.com/a/3f6103bc3ae99c8f) –

+0

@SimonKraemer:在這種情況下,MSVC不符合要求。 –

回答

6

因爲基類是相關的,也就是說,取決於您的模板參數T.在這些情況下,非限定名稱查找不考慮基類的範圍。所以你必須限定名稱,例如,這個。

this->value = val; 

請注意,MSVC是這個規則兼容,並會解析名稱,即使它是不合格的。

+3

流氓生活MSVC ... – UmNyobe

相關問題