我有一些C++代碼在沒有-fpermissive選項時不再編譯。 這是我無法分享的專有代碼,但我認爲我已經能夠提取一個簡單的測試用例來演示問題。下面是來自克輸出++C++模板中的名稱查找
template_eg.cpp: In instantiation of 'void Special_List<T>::do_other_stuff(T*) [with T = int]':
template_eg.cpp:27:35: required from here
template_eg.cpp:18:25: error: 'next' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
template_eg.cpp:18:25: note: declarations in dependent base 'List<int>' are not found by unqualified lookup
template_eg.cpp:18:25: note: use 'this->next' instead
因此,這裏是產生問題的代碼:
template<class T> class List
{
public:
void next(T*){
cout<<"Doing some stuff"<<endl;
}
};
template<class T> class Special_List: public List<T>
{
public:
void do_other_stuff(T* item){
next(item);
}
};
int main(int argc, char *argv[])
{
Special_List<int> b;
int test_int = 3;
b.do_other_stuff(&test_int);
}
我不是試圖找出如何解決代碼,使其重新編譯。 這只是一個改變下一個(項目)這個 - >下一個(項目) 的問題我試圖更好地理解爲什麼這個改變是必要的。 我在這個頁面發現了一個解釋:http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html 儘管這個解釋很有用,但我仍然有一些問題。不應該這樣的事實,即我的函數採用T *(指向類型T的指針)使其依賴於模板參數。 在我自己的措辭中,編譯器(gcc 4.7)不應該能夠找出next()函數在基類List中嗎? 爲什麼有必要在每個這樣的電話前加上這個 - >? 我注意到叮噹聲3.1表現出相同的行爲,所以我認爲在C++標準中有一些要求這種行爲的要求。任何人都可以提供一個理由嗎?
+1。簡短的解釋。 – Nawaz
謝謝!所以,如果我理解正確,接下來的論點是不相關的。 next()採用依賴參數,不會使next()相關的事實? – Avatar33
@ Avatar33:'next()'是相關的,但第二階段查找只會添加來自ADL的結果,其中不包含基數成員。我可能不得不重新回顧答案的形式...... –