gpt4 book ai didi

c++ - 具有部分模板特化的 g++ 错误

转载 作者:IT老高 更新时间:2023-10-28 22:39:30 25 4
gpt4 key购买 nike

我正在为 g++(版本 4.8.1_1,Macports)和 clang++(版本 3.3,Macports)编写一些 TMP 繁重的代码。虽然 g++ 使用 UNBRIDLED FURY 拒绝以下代码 list ,但 clang++ 使用 gracesplendor 编译它。

  • 哪个编译器是正确的? (我强烈怀疑它是 g++,但我想在提交错误报告之前从其他人那里得到一些保证。)
  • 您有什么简单或优雅的解决方法可以推荐吗? (我需要使用模板别名,因此不能切换到结构,这会导致 g++ 接受代码。)

这是代码 list ,专为您制作

template <class... Ts>
struct sequence;

template <int T>
struct integer;

// This definition of `extents` causes g++ to issue a compile-time error.
template <int... Ts>
using extents = sequence<integer<Ts>...>;

// However, this definition works without any problems.
// template <int... Ts>
// struct extents;

template <int A, int B, class Current>
struct foo;

template <int A, int B, int... Ts>
struct foo<A, B, extents<Ts...>>
{
using type = int;
};

template <int B, int... Ts>
struct foo<B, B, extents<Ts...>>
{
using type = int;
};

int main()
{
using t = foo<1, 1, extents<>>::type;
return 0;
}

这是 g++ 的输出:

er.cpp: In function 'int main()':
er.cpp:39:41: error: ambiguous class template instantiation for 'struct foo<1, 1, sequence<> >'
using t = typename foo<1, 1, extents<>>::type;
^
er.cpp:26:8: error: candidates are: struct foo<A, B, sequence<integer<Ts>...> >
struct foo<A, B, extents<Ts...>>
^
er.cpp:32:8: error: struct foo<B, B, sequence<integer<Ts>...> >
struct foo<B, B, extents<Ts...>>
^
er.cpp:39:43: error: 'type' in 'struct foo<1, 1, sequence<> >' does not name a type
using t = typename foo<1, 1, extents<>>::type;
^

这是 clang++ 的输出:

感谢您的帮助!

最佳答案

这似乎是一个 g++ 错误,因为很明显 foo<B, B, extents>foo<A, B, extents> 更专业(后者可以匹配前者匹配的任何内容,但反之则不然),因此编译器应该选择该特化。

正如您自己所说,更改 extents从模板别名到类模板,解决了问题。

关于c++ - 具有部分模板特化的 g++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17699858/

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