当编写类似C++11类似于std::tuple的类并尝试使用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),它将编译。
  • 如果删除(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是实验性实现之外,是否有任何原因使ojit_code不喜欢我的代码?

    最佳答案

    这很可能是在g++ 4.8中修复的bug in g++ 4.7。 Ideone(使用g++ 4.7.2,并且在不复制您的代码示例argh的情况下也无法链接到它)给出您提到的错误,而Coliru(使用g++ 4.8)进行编译时没有错误。

    09-06 13:01