Tôi chỉ gặp một tình huống rất lạ khi viết một lớp học C++11
std::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:
- Các mã không biên dịch:
- Nếu tôi thêm
(1)
, nó biên dịch. - Nếu tôi xóa
(1)
và(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?
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
[Biên dịch trong GCC 4.8.] (Http://coliru.stacked-crooked.com/view?id=2250fa21d618a80511a96c95725346f5-50d9cfc8a1d350e7409e81e87c2653ba) –
Đâ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. –