2013-05-28 188 views
5

我寫了一個類似C++11std::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. 的代碼無法編譯:
  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是否有任何理由不喜歡我的代碼,除了它是一個實驗性實現?

+2

你提供的代碼編譯得很好,從錯誤看來你不小心寫了'std :: tuple >'而不是'std :: tuple ...>'。請提供真實的代碼並在發佈之前再次嘗試。 – Xeo

+1

[編譯於GCC 4.8。](http://coliru.stacked-crooked.com/view?id=2250fa21d618a80511a96c95725346f5-50d9cfc8a1d350e7409e81e87c2653ba) –

+0

這是真正的代碼。我以爲我犯了你描述的錯誤,但事實上我沒有。 –

回答

3

這很可能是在g ++ 4.8中修復的bug in g++ 4.7。 Ideone(使用g ++ 4.7.2,在不復制代碼示例的情況下無法鏈接到它)argh)給出了您提到的錯誤,而Coliru(使用g ++ 4.8)編譯時沒有錯誤。

+0

它沒有堆疊彎曲。這是Coliru。雖然它是Stack-Croocked's。 –

+0

它被稱爲Stacked-Crooked on http://isocpp.org/get-started,不是它很重要 – TemplateRex

+0

我可以證實GCC 4.7.2給出了錯誤,而GCC 4.8和4.9快照沒有。但是,你鏈接到的特定bug說「固定爲4.7.1」..? – jogojapan