Eclipse CDT 无法解析模板 class 的 std::vector

Eclipse CDT can not resolve std::vector of template class

我将 Eclipse 与 cdt(Neon.3 Release 4.6.3)一起用作 C++ 的 IDE。

我的一些代码正在编译并且 运行 没问题,但我在配置 eclipse 时遇到问题。

在头文件中,我有一个模板 class,看起来像这样

template <int dimen, int neighbours, typenameDATATYPE >
class Grid {
  public:
    get_solidify_cells(const int &pos)
  private:
    std::vector<MacroCell<dimen, neighbours, DATATYPE>> macrogrid;
};

int Grid<dimen, neighbours, DATATYPE>::get_solidify_cells(const int &pos) {
    const MacroCell<dimen, neighbours, DATATYPE> cell = macrogrid[pos];
    const auto cell1 = macrogrid[pos];
    const auto cell2 = cell;
    return cell.get_solidify_cells();
}

MacroCell 有一个方法 get_solidify_cells.

auto 的分辨率,当鼠标悬停在它上面时 cell1 失败。因此它没有自动完成并且 F3 无法跳转到 get_solidify_cells

的定义

没有 auto ,因为这是 cell 自动完成的情况, F3 工作正常。

如果我将鼠标悬停在自动表单 cell1 上,我会得到 const 1 127 108 14 MSCAFE::Grid 3 10 103 129 5 3 #0 0 10 103 129 5 3 #1 0 #2 MSCAFE::Grid::macrogrid 0 35 MSCAFE::Grid::get_solidify_cells 0 0 cell1

如果我将鼠标悬停在自动表单 cell2 上,我会得到 const MacroCell<int3 #0 0,int3 #1 0,DATATYPE> cell2

C++11 集成正常,emplace_back 可以解决。

如何配置 Eclipse 以解决此问题?

这是演示该问题的简化代码(具有不同的标识符名称):

#include <vector>

template <typename T>
struct Waldo {
    void find();
};

template <typename T>
void foo(const std::vector<Waldo<T>>& v) {
    auto w = v[0];
    w.find();  // would like auto-completion after "w." to offer "find"
}

请注意,您在模板 内请求 auto-completion ,更具体地说,是在类型为 dependent 的对象上在模板参数上。总的来说,这是一个难题

在当今世界,有理由期待 IDE 可以做编译器可以做的一切,包括了解使用 auto 定义的变量类型。但是,当谈到模板时,重要的是要了解编译器在实例化之前对模板主体进行的处理很少。

当然,在上述情况下,编译器可以推断出变量的类型 w - 对于函数 foo 特定实例化 ,具有可用于替代 T 的具体类型。但是,它无法在实例化之前推断出 w 的类型——事实上,对于 T 的不同值,推断出的类型可能会有所不同。 (而且我不仅仅意味着 Waldo<int> 是不同于 Waldo<double> 的类型——由于 C++ 能够 专门化 模板,vector 可能专用于某些 Waldo<U>,因此它的 operator[] return 是完全不同的类型。现在你和我都知道那不会发生,但编译器无法知道.)

因此,在要求 IDE 在 w. 之后提供 auto-completion - 这需要知道 w 的类型 - 在 un-instantiated context,我们要求它做一些编译器永远不需要做的事情,而且通常不能准确地完成。

现在,IDEs(包括 Eclipse)确实使用 启发式 来尝试提供有用的 auto-completion 结果,即使在依赖上下文中,在 best-effort 基础。不幸的是,这些启发式方法往往无法看穿典型标准库实现中存在的大量模板元编程。 (作为练习,打开标准库的 <vector> 实现,看看 vector::reference_typeoperator[] 声明的 return 类型)是如何定义的。)

@RichardCritten 建议使用与 Eclipse 不同的 IDE。我不希望这有帮助。事实上,我邀请任何人向我展示一个 C++ IDE 确实 为上述内容提供准确的 auto-completion (这在语义上是正确的,而不仅仅是 "all the identifiers found in the file")代码示例。