我将eclipse与cdt(Neon.3版本4.6.3)一起用作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/