다른 템플릿 클래스에서 템플릿 메서드의 반환 값으로 다른 템플릿의 매개 변수로 정의 된 템플릿 클래스를 사용해야합니다. 나는 그것이 복잡하게 들린다는 것을 안다, 아래의 코드는 그것을 더 잘 설명한다. 문제는 코드를 컴파일 할 수 없다는 것입니다. 다음 오류로 끝납니다 :템플릿 메서드에서 템플릿 클래스의 템플릿 클래스 사용
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
그 문맥에 따라 이름이 있다고 생각
"템플릿이 아니라 형식이 아니라는 것을 컴파일러에 알리기 위해 template 키워드를 사용하십시오."나는'CDummy :: Policy2'에서 컴파일러가 "Policy2"가 정적이라고 가정합니다 데이터 멤버 또는 멤버 함수 (포인터), 형식이 아닙니다. –
@MikaelPersson : 흥미로운 질문입니다. 일반적으로 (즉, 기본적으로 의존적 인 이름은 non-type (non-template)이 아닌 것으로 간주됩니다.)하지만 모든 컨텍스트에 대해서는 사실이 아니며, 특히 컨텍스트에서 유형 필요합니다. 나는 이것이 그 상황 중 하나인지 확신하지 못하기 때문에 아마 맞을 것이다. 답변을 업데이트했습니다. –
감사합니다. 대단히 감사합니다. 문제가 해결되었습니다. (나는 이것을 생각하고 묻기 전에 시도했지만 분명히 잘못했다.) 대답의 두 번째 부분 (calc2() 메소드 구현) : 네, 감사합니다. 이전 오류로 인해 나는 그다지주의를 기울이지 않았다. –