【问题标题】:Eclipse CDT is reporting false erros while using std::index_sequenceEclipse CDT 在使用 std::index_sequence 时报告错误错误
【发布时间】: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-&gt; 的使用表明此代码出现在类范围内,但您的代码中没有类声明。)
  • 另外,CDT 对std::index_sequence 等标准库代码的理解能力取决于您使用的标准库版本,而这通常与编译器版本相关,因此请说明编译器版本你正在使用。
  • @HC4-reinstateMonica 我添加了一个完整的示例,其中 Eclipse 报告了同样的问题。编译器版本也已发布。
  • 谢谢,我现在可以重现该问题。这似乎与较新版本的 gcc 标准库在其实现 std::index_sequence 时使用名为 __integer_pack 的编译器内部函数有关,Eclipse CDT 不理解这一点。
  • 我更新了答案以反映该错误现已在 Eclipse CDT 中修复。

标签: c++17 eclipse-cdt


【解决方案1】:

问题是由于 gcc 8 和更新版本附带的标准库使用称为 __integer_pack 的新编译器内部函数来实现 std::make_integer_sequence(以及相关实用程序,如 std::make_index_sequence)。

Eclipse CDT 的解析器当前不理解 __integer_pack 内在函数,因此在这些较新的 gcc 版本中正确解析使用 std::make_integer_sequence / std::make_index_sequence 的代码时遇到问题。

filed a CDT bug 跟踪添加对 __integer_pack 内在函数的支持。

同时,您可以采用的解决方法是使用 gcc 7 或更早版本。如果您需要 gcc 8 或更高版本来实际构建您的代码,您仍然可以告诉 Eclipse 查看标准库头文件,例如gcc 7 通过将上述“内置编译器设置”配置中的${COMMAND} 替换为g++-7

更新:Eclipse 错误现已修复,该修复针对 CDT 的 9.11 版本(计划成为 Eclipse 2020-03 的一部分)。

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 2011-12-22
    • 1970-01-01
    • 2018-03-21
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2016-07-08
    相关资源
    最近更新 更多