gpt4 book ai didi

双重嵌套模板类中的 c++ static int def 因 clang++ 和 g++ 而失败

转载 作者:太空狗 更新时间:2023-10-29 22:59:09 25 4
gpt4 key购买 nike

使用以下代码:

struct my_symbols {
enum class syms { symb_0_0, symb_0_1 };
};
template
< typename SymbolEnums
>
struct outer {
using syms_0 = typename SymbolEnums ::syms;
template <syms_0 AnSym0, int Int>
struct inner {
static int const val;
};
};

template
< typename SymbolEnums
>
template
< typename outer<SymbolEnums>::syms_0 AnSym0
, int Int
>
int const outer<SymbolEnums>::inner<AnSym0, Int>::val = Int;

int main() {
return
outer<my_symbols>::
inner<my_symbols::syms::symb_0_1, 1>::val;
}

我明白了,gcc5.2.0:

template definition of non-template ‘int outer_tmpl::inner_tmpl::val’ val=Int; ^

使用 clang3.8.0,我得到:

nested name specifier 'outer_tmpl::inner_tmpl::' for declaration does not refer into a class, class template or class template partial specialization val=Int; ^

如何更正代码?

TIA。

最佳答案

我不确切地知道为什么发布的代码不起作用。我怀疑答案深藏在 C++ 标准名称查找规则中,这些规则非常复杂——当然,假设这实际上不是编译器错误。这里的其他人可能知道。

以下“等效”示例在 GCC 5.2.0 和 Clang 3.8 上编译。它们可能适合也可能不适合您的情况。

示例1:使用constexpr和类内初始化

struct my_symbols {
enum class syms { symb_0_0, symb_0_1 };
};

template<typename SymbolEnums>
struct outer {

using syms_0 = typename SymbolEnums::syms;

template <syms_0 AnSym0, int Int>
struct inner {
static constexpr int val = Int;
};
};

int main() {
return outer<my_symbols>::inner<my_symbols::syms::symb_0_1, 1>::val;
}

示例 2:调整嵌套模板类型参数

struct my_symbols {
enum class syms { symb_0_0, symb_0_1 };
};

template<typename SymbolEnums>
struct outer {

using syms_0 = typename SymbolEnums::syms;

template <syms_0 AnSym0, int Int>
struct inner {
static int const val;
};
};

template<typename SymbolEnums>
template<typename SymbolEnums::syms AnSym0, int Int>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
int const outer<SymbolEnums>::inner<AnSym0, Int>::val = Int;

int main() {
return outer<my_symbols>::inner<my_symbols::syms::symb_0_1, 1>::val;
}

关于双重嵌套模板类中的 c++ static int def 因 clang++ 和 g++ 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com