2011-12-15 5 views
9

데비안 (Debian) 스퀴즈에서 gcc 4.4를 사용하고 있습니다. 다음 코드를 고려하십시오.템플릿 템플릿 매개 변수 및 gcc가있는 가변 템플릿 4.4

#include <map> 
#include <string> 
using std::map; 
using std::string; 

// Args lets the user specify additional explicit template arguments 
template <typename T, 
     template <typename T, typename... Args> class C, 
     typename... Args> 
C<T, Args...> foo() 
{ 
    C<T, Args...> x; 
    return x; 
} 

int main(void) 
{ 
    map<string, int> a = foo<string, map, int>(); 
} 

그래서, 여기에 아이디어는 그 T 일치 string, C 경기 map 및 템플릿 매개 변수 팩 Args 일치 int. 구문 오류가있을 수 있으므로 수정하십시오. 특히 class C의 첫 번째 템플릿 인수가 T과 일치하고 나머지가 템플릿 매개 변수 팩 Args과 일치하도록하려면 template <typename T, typename... Args> class C 올바른 구문입니까?

이 질문 Variadic template templates and perfect forwarding 유사하게 나타나는 오류를

In function 'int main()': 
post.cc:18: error: no matching function for call to 'foo()' 

을 제공합니다. 그 질문은 이것이 gcc 버그라는 것을 암시하지만 어쩌면 나는이 질문들이 똑같은 것임을 생각하는 데 착각 할 것입니다.

친절하십시오. variadic 템플릿에 대한 지식은 12 시간 미만입니다. 나는 복제를 줄이기 위해 오래된 C++ 코드를 다시 작성하려고 시도했을뿐입니다. 내가 C++을 한 이후로 역시 오래되었습니다. 해결 방법이 있으면 알려주십시오. 감사.

편집 : Variadic template templates and perfect forwarding에 의해 제안 된 해결 방법은 Ise Wisteria이 나를 위해 일한, 이것은 동일한 버그 제안합니다. 물론, 저는 지금 입니다. (a)이 해결 방법이 얼마나 허술한 지, (b) 왜 작동하는지, 그리고 이세가 그것을 생각하게 한 이유는 무엇입니까? 이세 만이 마지막 비트에 대답 할 수 있다고 생각합니다. :-)

+0

코드는 g ++ 4.7에서 컴파일됩니다. 버그 야. – kennytm

+0

@KennyTM : 감사합니다. 그게 내가보고 할 필요가 없다는 뜻이지? –

+0

오른쪽. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ – kennytm

답변

3

는 내 질문에 링크 된 질문 Variadic template templates and perfect forwarding 같은 버그를 간질이 나타납니다. 특히 링크에있는 해결 방법은 제 경우에도 작동합니다. 수정 된 코드는 다음과 같습니다 :

#include <map> 
#include <string> 
using std::map; 
using std::string; 

template <typename T, 
     template <typename T, typename... Args> class C, 
     typename... Args> 
struct X 
{ 
    typedef C<T, Args...> type; 
}; 

template <typename T, 
     template <typename T, typename... Args> class C, 
     typename... Args> 
typename X<T, C, Args...>::type foo() 
{ 
    C<T, Args...> x; 
    return x; 
} 

int main(void) 
{ 
    map<string, int> a = foo<string, map, int>(); 
} 
0

가변 인자 템플릿 매개 변수가 g ++ 4.4에서 비 가변 인자와 일치 할 수 있다고 생각하지 않으므로 가변 인자가 아닌 버전으로 foo 함수를 오버로드해야합니다.

지도에는 실제로 두 개 이상의 템플릿 매개 변수가 있으므로 새로운 foo-function과 일치하지 않습니다.

귀하의 예를 들어이 또한 그것을 명확히해야한다 : 편집에서 설명하고있는 바와 같이

#include <map> 
#include <string> 
using std::map; 
using std::string; 

// Args lets the user specify additional explicit template arguments 
template <typename T, 
      template <typename T, typename... Args> class C, 
      typename... Args> 
C<T, Args...> foo() { 
    C<T, Args...> x; 
    return x; 
} 

template<typename T, template<typename, typename> class C, typename Arg> 
C<T, Arg> foo() { 
    return C<T, Arg>(); 
} 

template<typename T, typename... Args> class A {}; 

template<typename T, typename Arg> class B {}; 

int main(void) { 
    map<string, int> a = foo<string, map, int>(); // fails. 
    A<string, int> x = foo<string, A, int>(); 
    B<string, int> y = foo<string, B, int>(); 
} 
+0

아니요, 가변 템플릿은 명시 적으로 비가 변형 템플릿과 일치시킬 수 있습니다. – Xeo

+0

@Xeo : g ++ 4.4이 아님 – masaers

+0

글쎄, 그건 버그 야. 나는 표준이 말하는 것에 대해 이야기하고있다."가변성 템플릿 매개 변수가 비 가변적 인수와 일치 할 수 있다고 생각하지 않습니다."일반적인 생각이라고 생각하는 것처럼 보였습니다. – Xeo