2013-05-28 41 views
5

Tôi chỉ gặp một tình huống rất lạ khi viết một lớp học C++11std::tuple giống như và cố gắng biên dịch nó với g++-4.7. Những gì tôi về cơ bản cần là một tuple của các loại bọc. Tôi đã viết một cái gì đó như thế này:Tham số gói Confusion

#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; 
} 

tôi đã quan sát sau:

  1. Các mã không biên dịch:
  2. Nếu tôi thêm (1), nó biên dịch.
  3. Nếu tôi xóa (1)(2), nó cũng sẽ biên dịch.

Thông báo lỗi cho 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’ 

Câu hỏi: Theo tôi đoạn code trên là chính xác, nhưng nó là lần đầu tiên mà tôi thực sự sử dụng gói tham số. Có bất kỳ lý do nào mà g++-4.7 không thích mã của tôi ngoại trừ thực tế rằng nó là một triển khai thử nghiệm?

+2

Mã bạn cung cấp biên dịch tốt và từ lỗi có vẻ như bạn đã vô tình viết 'std :: tuple >' thay vì 'std :: tuple ...>'. Vui lòng cung cấp mã thực và thử lại trước khi đăng. – Xeo

+1

[Biên dịch trong GCC 4.8.] (Http://coliru.stacked-crooked.com/view?id=2250fa21d618a80511a96c95725346f5-50d9cfc8a1d350e7409e81e87c2653ba) –

+0

Đây là mã thực. Tôi nghĩ rằng tôi đã thực hiện các lỗi mà bạn mô tả, nhưng trên thực tế tôi đã không. –

Trả lời

3

Điều này rất có thể là bug in g++ 4.7 được sửa trong g ++ 4.8. Ideone (sử dụng g ++ 4.7.2 và tôi không thể liên kết mà không sao chép ví dụ mã của bạn, argh) đưa ra lỗi bạn đề cập, trong khi Coliru (sử dụng g ++ 4.8) biên dịch mà không có lỗi.

+0

Nó không được xếp chồng lên nhau. Đó là Coliru. Mặc dù nó là Stack-Croocked's. –

+0

nó được gọi là Stacked-Crooked trên http://isocpp.org/get-started, không phải là nó quan trọng – TemplateRex

+0

Tôi có thể xác nhận rằng GCC 4.7.2 cho lỗi, trong khi GCC 4.8 và 4.9 ảnh chụp thì không. Nhưng lỗi cụ thể bạn liên kết để nói "cố định cho 4.7.1" ..? – jogojapan

Các vấn đề liên quan