Eclipse CDT 在使用 std::index_sequence 时报告错误
Eclipse CDT is reporting false erros while using std::index_sequence
更新:添加了完整的示例和编译器信息
我有带 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 等 -> Providers 如下:
${COMMAND} ${FLAGS} -E -P -v -dD -std=c++17 "${INPUTS}"
同样适用于 CDT Cross GCC 内置编译器设置。
重建索引并没有帮助。
我使用的 GCC 版本:
gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0
非常感谢任何愿意提供帮助的人...
问题是由于 gcc 8 和更新版本附带的标准库使用一个名为 __integer_pack
的新编译器内部函数来实现 std::make_integer_sequence
(以及相关实用程序,如 std::make_index_sequence
).
Eclipse CDT 的解析器当前无法理解 __integer_pack
内在函数,因此它无法正确解析使用 std::make_integer_sequence
/ std::make_index_sequence
的代码以及这些较新的gcc 版本。
我 filed a CDT bug 跟踪添加对 __integer_pack
内部函数的支持。
同时,您可以采用的解决方法是使用 gcc 7 或更早版本。如果您需要 gcc 8 或更新版本来实际构建您的代码,您仍然可以告诉 Eclipse 查看标准库头文件,例如gcc 7 将上述 "built-in compiler settings" 配置中的 ${COMMAND}
替换为 g++-7
.
更新:Eclipse 错误现已修复,修复目标是 CDT 的 9.11 版本(计划成为 Eclipse 2020-03 的一部分)。
更新:添加了完整的示例和编译器信息
我有带 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 等 -> Providers 如下:
${COMMAND} ${FLAGS} -E -P -v -dD -std=c++17 "${INPUTS}"
同样适用于 CDT Cross GCC 内置编译器设置。
重建索引并没有帮助。
我使用的 GCC 版本:
gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0
非常感谢任何愿意提供帮助的人...
问题是由于 gcc 8 和更新版本附带的标准库使用一个名为 __integer_pack
的新编译器内部函数来实现 std::make_integer_sequence
(以及相关实用程序,如 std::make_index_sequence
).
Eclipse CDT 的解析器当前无法理解 __integer_pack
内在函数,因此它无法正确解析使用 std::make_integer_sequence
/ std::make_index_sequence
的代码以及这些较新的gcc 版本。
我 filed a CDT bug 跟踪添加对 __integer_pack
内部函数的支持。
同时,您可以采用的解决方法是使用 gcc 7 或更早版本。如果您需要 gcc 8 或更新版本来实际构建您的代码,您仍然可以告诉 Eclipse 查看标准库头文件,例如gcc 7 将上述 "built-in compiler settings" 配置中的 ${COMMAND}
替换为 g++-7
.
更新:Eclipse 错误现已修复,修复目标是 CDT 的 9.11 版本(计划成为 Eclipse 2020-03 的一部分)。