【问题标题】:Parameter Pack Confusion参数包混淆
【发布时间】:2013-05-23 01:39:21
【问题描述】:

我在写C++11std::tuple-like 类并尝试用g++-4.7 编译它时遇到了一个非常奇怪的情况。我基本上需要的是一个包装类型的元组。我写了这样的东西:

#include <tuple> 

template <class T> 
struct Wrapper { T x; }; 

template <class... Types> 
using Tuple = std::tuple<Wrapper<Types>...>; 

template <class... Types> 
struct X 
{ 
    using MyTuple = Tuple<Types...>; 
}; 

int main( int argc, char** argv ) 
{ 
    // Tuple<int,int> t;  // (1)
    using Y = X<int,int>;
    Y y;                  // (2)
    return 0; 
}

我做了以下观察:

  1. 代码无法编译:
  2. 如果我添加(1),它会编译。
  3. 如果我删除 (1) 和 (2),它也会编译。

1. 的错误消息:

test.cpp: In instantiation of ‘struct X<int, int>’:
test.cpp:22:4:   required from here
test.cpp:10:44: error: wrong number of template arguments (2, should be 1)
test.cpp:4:8: error: provided for ‘template<class T> struct Wrapper’

问题:我认为上面的代码是正确的,但这是我第一次真正使用参数包。 g++-4.7 不喜欢我的代码,除了它是一个实验性实现之外,还有什么原因吗?

【问题讨论】:

  • 您提供的代码编译得很好,从错误来看,您似乎不小心写了std::tuple&lt;Wrapper&lt;Types...&gt;&gt;而不是std::tuple&lt;Wrapper&lt;Types&gt;...&gt;。请提供真实代码并在发布前重试。
  • 这是真正的代码。我以为我犯了你描述的错误,但实际上我没有。

标签: c++ c++11 g++ tuples variadic-templates


【解决方案1】:

这很可能是在 g++ 4.8 中修复的bug in g++ 4.7。 Ideone(使用 g++ 4.7.2,如果不复制您的代码示例,我无法链接到它,啊)给出了您提到的错误,而 Coliru(使用 g++ 4.8)编译没有错误。

【讨论】:

  • 它不是堆叠弯曲的。是科利鲁。虽然是 Stack-Croocked 的。
  • 在isocpp.org/get-started 上叫做 Stacked-Crooked,没关系
  • 我可以确认 GCC 4.7.2 给出了错误,而 GCC 4.8 和 4.9 快照没有。但是您链接到的特定错误说“已为 4.7.1 修复”..?
  • @rhalbersma:当它被添加到那里时并没有名字,所以他们可能只是取了地址 - 但它的创建者 (StackedCrooked) 将它命名为“Coliru”,就是这样还有在编辑模式下显示在顶部的内容。 :)
  • @jogojapan 我链接的错误具有相同的错误消息和相同的语言功能,但发生在与此问题不同的上下文中。只是推测,但它可能具有相同的潜在缺陷,在 4.7.1 中部分修复,在 4.8 中更完全修复。不过,我找不到 4.7.2 的相同错误。
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多