c++ - Eclipse CDT 无法解析模板类的 std::vector

标签 c++ eclipse templates eclipse-cdt stdvector

我正在使用带有 cdt(Neon.3 版本 4.6.3)的 eclipse 作为 C++ 的 IDE。

我的一些代码可以正常编译和运行,但我在配置 eclipse 时遇到问题。

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

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"
}

请注意,您要求自动完成在模板内,更具体地说是针对其类型依赖模板参数的对象。一般来说,这是一个难题

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

当然,在上面的例子中,编译器可以推断出变量的类型 w - 用于函数的特定实例化 foo , 有一个具体的类型可以替代 T .但是,它无法推断出 w 的类型。在实例化之前——事实上,对于 T 的不同值,推导的类型可能不同。 . (我不只是说 Waldo<int>Waldo<double> 是不同的类型——由于 C++ 能够专门化 模板,vector 可能专门用于某些 Waldo<U>,这样它的 operator[] 返回一个完全不同的类型。现在你我都知道那不会发生,但编译器无法知道这一点。)

因此,在要求 IDE 在 w. 之后提供自动完成功能时- 这需要知道 w 的类型- 在未实例化的上下文中,我们要求它做一些编译器永远不需要做的事情,而且通常无法准确完成。

现在,IDE(包括 Eclipse)确实采用了启发式,即使在依赖上下文中,也会尽最大努力尝试提供有用的自动完成结果。不幸的是,这些启发式方法往往无法看穿典型标准库实现中存在的大量模板元编程。 (作为练习,打开标准库的 <vector> 实现,看看 vector::reference_type(operator[] 的声明返回类型)是如何定义的。)

@RichardCritten 建议使用与 Eclipse 不同的 IDE。我不希望这有帮助。事实上,我邀请任何人向我展示一个 C++ IDE,它确实为上面的代码示例提供准确的自动完成(这在语义上是正确的,而不仅仅是“文件中找到的所有标识符”)。

关于c++ - Eclipse CDT 无法解析模板类的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49733698/

相关文章:

c++ - 提取模板类型的签名?

c++ - ALSA 在 Raspberry Pi 模拟输出上接收和播放原始 PCM 的配置

C++ 错误 : Class has-a-relationship with Struct in Same Header File

java - 将 Maven 与 Eclipse Kepler 集成的问题

c++ - VC++ 2010 忽略断点

android - 在 Eclipse 中调试 Android 项目突然不起作用了

c++ - 在带有可变参数模板的基于模板的类中进行完善转发?

c++ - 指向模板类方法的指针的 Typedef

c++ - Koenig Lookup 的奇怪行为

c++ - 为什么具有 CRT 版本 30729.4148 的嵌入式 list 的程序在运行时在 winsxs 文件夹中以 30729.6161(最新)运行?