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

时间:2018-04-09 13:05:00

标签: c++ eclipse templates eclipse-cdt stdvector

我使用eclipse和cdt(Neon.3 Release 4.6.3)作为C ++的IDE。

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

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

MacroCell

get_solidify_cells有一个方法auto

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

的定义

没有F3,因为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自动完成并且const MacroCell<int3 #0 0,int3 #1 0,DATATYPE> cell2工作正常。

如果我将鼠标悬停在自动表格单元格1上,我会收到C++11

如果我将鼠标悬停在自动格式单元格2上,我会收到emplace_back

import typing @contextlib.contextmanager def foo() -> ???: yield 集成工作正常,typing.Generator[None, None, None]可以解决。

如何配置eclipse,以解决此问题?

1 个答案:

答案 0 :(得分:1)

这是一段简化的代码(具有不同的标识符名称),用于演示此问题:

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

请注意,您要求在模板中自动完成,更具体地说,要求在模板参数上类型为 dependent 的对象。这是一个难题

在今天的世界中,期望IDE可以完成编译器可以执行的所有操作,包括了解使用auto定义的变量类型,这是合理的。但是,在模板方面,了解编译器在实例化之前对模板体进行的处理非常重要。

当然,在上面的例子中,编译器可以推导出变量w的类型 - 用于函数foo特定实例化,具体可用类型替换T。但是,它不能在实例化之前推导出w的类型 - 事实上,对于T的不同值,推断的类型可能会有所不同。 (并且我并不仅仅意味着Waldo<int>Waldo<double>的类型不同 - 感谢C ++能够专门化模板,{ {1}}可能专门用于某些vector,以使其Waldo<U>返回完全不同的类型。现在您和我知道这不会发生,但是没有办法编译器要知道。)

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

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

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