【问题标题】:Eclipse CDT can not resolve method in template classEclipse CDT 无法解析模板类中的方法
【发布时间】:2014-01-24 18:50:30
【问题描述】:
我对 Eclipse CDT 索引器/代码分析器有疑问。当我在编辑器中编写以下代码时,它在 const int* p = x.f(); - Invalid arguments Candidates are: int * f() 上显示错误。因此,由于某种原因,它无法识别 B 类中的方法 const T* f() const。
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();
}
任何想法为什么会发生以及如何解决问题?
【问题讨论】:
标签:
c++
eclipse
eclipse-cdt
【解决方案1】:
为什么会这样?
因为 CDT C++ 解析器无法识别 using A<T>::f
在类B中声明一个满足调用的成员函数
const int* p = x.f() 在main()。您可以通过添加
const 限定符到 T* B::f()。这满足了解析器(但击败了
成员函数的用途)。
如何解决问题?
嗯,在基类中有const T* f() const 似乎很奇怪
和派生类中的T* f()。除非有一些令人信服的
为此,您可以在A 或B(可能是A)中声明这两个成员函数。或者,但没有吸引力,您可以:
- 给他们起不同的名字,可能是
f和f_const,或者
- 删除
using A<T>::f; 并将 const int* p = x.(); 替换为
明确限定的调用const int* p = x.A<int>::f();
你也可以忽略这个问题,因为解析器的混淆不会
停止在 IDE 中成功构建程序。 (很高兴有一个实时 C++
解析器,除非它与您的编译器不一致)。