2013-05-28 2 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)를 추가하면 컴파일 않는 I는 다음과 같이 썼다.
  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

누적되지 않습니다. 콜릴 루야. 그것은 Stack-Croocked의 것이지만. –

+0

그것은 http://isocpp.org/get-started에서 stacked-Crooked라고 불리우며, 중요하지는 않습니다. – TemplateRex

+0

GCC 4.7.2가 오류를 나타내는 반면 GCC 4.8 및 4.9 스냅 샷은 오류를 나타냅니다. 하지만 당신이 링크를 특정 버그는 "고정 4.7.1"..? – jogojapan