【发布时间】:2020-03-27 23:58:46
【问题描述】:
更新:添加了完整的示例和编译器信息
我有带有 CDT 9.7.0.20190309 的 Eclipse 2019-03 (4.11.0),并且在 C++17 中使用 std::index_sequence 时内置编译器报告误报错误:
#include <gtest/gtest.h>
#include <utility>
#include <array>
class Sample {
public:
template<std::size_t N >
std::size_t get_percentage( void ) {
return N;
}
template<std::size_t... Is>
inline std::array<std::size_t, sizeof...(Is)> calculate_percentages( std::index_sequence<Is...> ) noexcept {
return { this->get_percentage<Is>()... };
}
template<std::size_t N>
inline std::array<std::size_t, N> get_percentages( void ) noexcept {
return this->calculate_percentages( std::make_index_sequence<N>() );
/* ^^^^^^^^^^^^^^^^^^^^^ : Invalid arguments ' Candidates are: std::array calculate_percentages(std::integer_sequence) ' */
}
};
TEST( IntegerSequence, InvalidArgumentsError ) {
Sample test;
std::array<std::size_t, 5> data = test.get_percentages<5>();
for( int i = 0; i < 5; i++ ) {
std::cout << data[i] << std::endl;
}
}
int main( int argc, char ** argv ) {
testing::InitGoogleTest( &argc, argv );
return RUN_ALL_TESTS();
}
但是正常编译成功,没有任何问题。
我的 CDT GCC 内置编译器设置 Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers如下:
${COMMAND} ${FLAGS} -E -P -v -dD -std=c++17 "${INPUTS}"
这同样适用于 CDT Cross GCC 内置编译器设置。
重建索引在那里没有帮助。
我使用的 GCC 版本:
gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0
非常感谢任何愿意提供帮助的人...
【问题讨论】:
-
请发布完整的代码示例。 (您对
this->的使用表明此代码出现在类范围内,但您的代码中没有类声明。) -
另外,CDT 对
std::index_sequence等标准库代码的理解能力取决于您使用的标准库版本,而这通常与编译器版本相关,因此请说明编译器版本你正在使用。 -
@HC4-reinstateMonica 我添加了一个完整的示例,其中 Eclipse 报告了同样的问题。编译器版本也已发布。
-
谢谢,我现在可以重现该问题。这似乎与较新版本的 gcc 标准库在其实现
std::index_sequence时使用名为__integer_pack的编译器内部函数有关,Eclipse CDT 不理解这一点。 -
我更新了答案以反映该错误现已在 Eclipse CDT 中修复。
标签: c++17 eclipse-cdt