【问题标题】: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&lt;T&gt;::f 在类B中声明一个满足调用的成员函数 const int* p = x.f()main()。您可以通过添加 const 限定符到 T* B::f()。这满足了解析器(但击败了 成员函数的用途)。

    如何解决问题?

    嗯,在基类中有const T* f() const 似乎很奇怪 和派生类中的T* f()。除非有一些令人信服的 为此,您可以在AB(可能是A)中声明这两个成员函数。或者,但没有吸引力,您可以:

    • 给他们起不同的名字,可能是ff_const,或者
    • 删除 using A&lt;T&gt;::f; 并将 const int* p = x.(); 替换为 明确限定的调用const int* p = x.A&lt;int&gt;::f();

    你也可以忽略这个问题,因为解析器的混淆不会 停止在 IDE 中成功构建程序。 (很高兴有一个实时 C++ 解析器,除非它与您的编译器不一致)。

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多