2013-06-25 5 views
3

다른 템플릿 클래스에서 템플릿 메서드의 반환 값으로 다른 템플릿의 매개 변수로 정의 된 템플릿 클래스를 사용해야합니다. 나는 그것이 복잡하게 들린다는 것을 안다, 아래의 코드는 그것을 더 잘 설명한다. 문제는 코드를 컴파일 할 수 없다는 것입니다. 다음 오류로 끝납니다 :템플릿 메서드에서 템플릿 클래스의 템플릿 클래스 사용

type/value mismatch at argument 2 in template parameter list for 'template<class T, template<class> class Policy> class Result' 
expected a class template, got 'CDummy<T2>::Policy2' 

그러나 주어진 클래스가 필요로한다는 것은 확실합니다. 문제는 그것을 사용하는 메서드도 템플릿이기 때문에 컴파일러는 정확히 CDummy<T2>::Policy2이 무엇인지 모릅니다. Policy2이 템플릿이 아니고 일반 클래스가 아니거나 인수를 채울 수 있다면 typename을 사용하면 컴파일러에게 걱정하지 말라고 할 것이지만 어떻게 템플릿을 사용하여이 작업을 수행 할 수 있습니까?

// I cannot change this interface - it's given by a library 
template <class T, template <class> class Policy> 
class Result : public Policy<T> 
{ 
    T data; 
}; 

template <class T> 
class Policy1 
{ 

}; 

// I use this for allowing Policy2 to change behaviour according Dummy 
// while it keeps template interface for class above 
template <class Dummy> 
class CDummy 
{ 
public: 
    template <class T> 
    class Policy2 : public Policy1<T> 
    { 

    }; 
}; 

// Both variables are created ok 
Result<int, Policy1 > var1; 
Result<int, CDummy<float>::Policy2 > var2; 

// This is ok, too 
template <class T> 
Result<T, Policy1 > calc1() 
{ 
    return Result<int, Policy1>(); 
} 

// But this ends with the error: 
// type/value mismatch at argument 2 in template parameter list for 'template<class T, template<class> class Policy> class Result' 
// expected a class template, got 'CDummy<T2>::Policy2' 
template <class T1, class T2> 
Result<T1, CDummy<T2>::Policy2 > calc2() // <-- Here is the generated error 
{ 
    typedef typename DummyTypedef CDummy<T2>; 
    return Result<T1, DummyTypedef::Policy2>(); 
} 

참고 :

  • 나는 GNU/리눅스 우분투 13.04에서 GCC 4.7.3 32 비트를 사용합니다. 32 비트. 여러 가지 이유로
  • , 나는 (아직) C++ 11 표준을 사용할 수 없습니다 그래서 내가 이름 CDummy<T2>::Policy2 그 문맥에 따라 이름이 있다고 생각

답변

3

템플릿 형식 정의를 사용할 수 없으며이를 사용해야 template 키워드는 실제로 템플릿임을 컴파일러에 알립니다.

template <class T1, class T2> 
Result<T1, CDummy<T2>::template Policy2 > calc2() // <-- Here is the generated error 
//      ^^^^^^^^ 

또한 동일한 기능의 구현이 잘못된 것처럼 보입니다. typedef의 순서는 원래 이름, 새 이름이며, CDummy<T2>은 (즉, typename에 대한 필요가 없습니다) 유형을 것으로 알려져있다 : return 문은 다음이 될 것

typedef CDummy<T2> DummyTypedef; 

가 :

return Result<T1, DummyTypedef::template Policy2>(); 
+0

"템플릿이 아니라 형식이 아니라는 것을 컴파일러에 알리기 위해 template 키워드를 사용하십시오."나는'CDummy :: Policy2'에서 컴파일러가 "Policy2"가 정적이라고 가정합니다 데이터 멤버 또는 멤버 함수 (포인터), 형식이 아닙니다. –

+0

@MikaelPersson : 흥미로운 질문입니다. 일반적으로 (즉, 기본적으로 의존적 인 이름은 non-type (non-template)이 아닌 것으로 간주됩니다.)하지만 모든 컨텍스트에 대해서는 사실이 아니며, 특히 컨텍스트에서 유형 필요합니다. 나는 이것이 그 상황 중 하나인지 확신하지 못하기 때문에 아마 맞을 것이다. 답변을 업데이트했습니다. –

+0

감사합니다. 대단히 감사합니다. 문제가 해결되었습니다. (나는 이것을 생각하고 묻기 전에 시도했지만 분명히 잘못했다.) 대답의 두 번째 부분 (calc2() 메소드 구현) : 네, 감사합니다. 이전 오류로 인해 나는 그다지주의를 기울이지 않았다. –

관련 문제