템플릿 템플릿이 아래 표시된 것과 유사한 기능을 구현하는 방법에 대해 고민하고 있습니다.다른 템플릿 인수를 허용하는 템플릿 템플릿 컬렉션
두 개의 클래스 (Java)를 고려하십시오. 첫 번째 클래스는 두 번째 템플릿 인수의 객체가 저장 될 수 있음을 지정하여 pack
메소드에 의해 반환되는 컬렉션을 제한하고 :
abstract class ContainerPacker<T, Container extends Collection<T>> {
abstract Container pack(T t);
}
그리고이 클래스의 구현의 말을하자를 Integer
유형은 볼 수 있었다 like :
class IntegerContainerPacker extends ContainerPacker<Integer, List<Integer>> {
@Override
List<Integer> pack(Integer t) {
List<Integer> list = new ArrayList<>(t);
list.add(t);
return list;
}
}
이제 저는 C++에서 템플릿 템플릿을 사용하여 비슷한 작업을하고 싶습니다.
template <typename T, template <typename U> class Container>
class ContainerPacker {
public:
virtual Container<T> pack(T) = 0;
};
나는 문제가 있지만 그것을 구현하는 데 문제가 다음 Container
템플릿 자체가 얼마나 알 수 있습니다. 아래의 코드는 컴파일되지 않습니다 :
class IntegerVectorPacker : public ContainerPacker<int, std::vector> {
public:
std::vector<int> pack(int t) {
std::vector<int> v = std::vector<int>();
v.push_back(t);
return v;
}
};
오류는 다음과 같습니다
error: type/value mismatch at argument 2 in template parameter list for ‘template class Container> class ContainerPacker’ class IntegerVectorPacker : public ContainerPacker {
및
note: expected a template of type ‘template class Container’, got ‘template class std::vector’
내가 대답을 찾고 있었어요하지만 그것도 어려운 일이 무엇인지 질문을 알아 내기 위해 묻다. 템플릿 템플릿은 어렵습니다. 코드에서
template <typename T, template <typename...> class Container>
문제 (? 문제)와
가
두 번째 오류는 'std :: vector'인 전체 전문화를 제공하는 대신 두 번째 템플릿 매개 변수로'std :: vector'를 제공한다는 것과 관련이있는 것으로 보입니다. 그것은 템플릿 클래스를 기대했지만 클래스 이름을 제공했다는 것입니다. –
Howard