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();
}
任何想法为什么会发生以及如何解决问题?
答案 0 :(得分: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 ++ 解析器,除非它与您的编译器不一致)。