2014-01-23 44 views
1

我在Eclipse CDT索引器/代碼分析器中遇到問題。當我在編輯器中編寫以下代碼時,它會在const int* p = x.f(); - Invalid arguments Candidates are: int * f()上顯示錯誤。因此,對於某種原因,它不會在B類識別方法const T* f() constEclipse CDT無法解析模板類中的方法

template<typename T> 
class A { 
public: 
    const T* f() const { return 0; } 
}; 

template<typename T> 
class B : A<T> { 
public: 
    using A<T>::f; 
    T* f() { return 0; } 
}; 

void main() { 
    const B<int> x; 
    const int* p = x.f(); 
} 

它爲什麼會發生,以及如何解決這個問題的任何想法?

回答

1

爲什麼會發生?

由於CDT C++解析器沒有認識到using A<T>::f 聲明在B類滿足呼叫 const int* p = x.f()main()的成員函數。您可以通過將 const限定符添加到T* B::f()來驗證此情況。這滿足瞭解析器(但是會破壞成員函數的目的)。

如何解決問題?

嗯,這似乎奇怪有const T* f() const基類 和T* f()在派生類中。除非有一些令人信服的原因,否則您可以聲明AB(可能是A)中的兩個成員函數。或者,但不吸引人,你可以:

  • 給他們不同的名字,也許ff_const,或
  • 刪除using A<T>::f;與 取代const int* p = x.();的明確限定的通話const int* p = x.A<int>::f();

你也可以忽略這個問題,因爲解析器的混淆不會在 中停止在IDE中成功構建程序。 (很高興有一個實時C++ 解析器,除非它不同意你的編譯器)。