내 현재 코드는 같습니다 Code here내부 템플릿 클래스를 외부 템플릿 클래스 유형으로 가져 오는 방법은 무엇입니까? 다음과 같은
내가 템플릿 ClassOuter
및 TypeD
이 TypeA, TypeB, TypeC
의 모든 유형과 다른이 될 수있는 중첩 템플릿 ClassInnerBase
을 보유하고 있습니다. 또한 ClassInnerDerived
은 ClassInnerBase
에서 상속 받아 virtual const int Method(int id) = 0;
을 구현해야합니다.
template<typename TypeA, typename TypeB, typename TypeC>
class ClassOuter {
public:
class ClassInnerBase {
public:
ClassInnerBase(int x) :
m_x(x) {
}
virtual const int Method(int id) = 0;
private:
int m_x;
};
template<typename TypeD>
class ClassInnerDerived : public ClassInnerBase {
public:
ClassInnerDerived<TypeD>(const TypeD &object, int x) :
ClassInnerBase(x), m_object(object) {
}
// Implementation of ClassInnerBase::Method for type float
template<>
const int ClassInnerDerived<float>::Method(int id){
return GetLookupID(id);
}
// Implementation of ClassInnerBase::Method for type double
template<>
const int ClassInnerDerived<double>::Method(int id){
return GetLookupID(id);
}
private:
TypeD m_object;
};
void DoSomething(const std::vector<ClassInnerBase> &inner_vec, int id);
const int GetLookupID(int id) const{
return lookup[id];
}
private:
int lookup[100];
};
template<typename TypeA, typename TypeB, typename TypeC>
void ClassOuter<TypeA, TypeB, TypeC>::DoSomething(const std::vector<ClassInnerBase> &inner_vec, int id){
for(const auto &inner : inner_vec){
inner.Method(id);
}
}
int main()
{
std::vector<typename ClassOuter<int, double, float>::ClassInnerBase> class_base_objects;
typename ClassOuter<int, double, float>::template ClassInnerDerived<float> class_inner_derived_object(0.2f, 1);
class_base_objects.push_back(class_inner_derived_object);
typename ClassOuter<int, double, float>::template DoSomething(class_base_objects, 1);
}
나는 오류를 그만 둘 :
g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp:30:18: error: explicit specialization in non-namespace scope 'class ClassOuter<TypeA, TypeB, TypeC>::ClassInnerDerived<TypeD>'
template<>
^
여기 꽤 붙어있어이 오류를 해결하는 방법을 모르겠어요. 또한 구현시 제안/의견/개선 사항이 있습니까?
당신은 더 나은에서 더 나을 것 [코드 검토 (구현에 대한 개선을 위해 http://codereview.stackexchange.com/) – Rakete1111
@ Rakete1111 아니요, 코드 검토는저기서 화제이기 때문에 코드가 깨진 곳이 아닙니다. 그는 올바른 사이트에서 물었다. – syb0rg
@ syb0rg 개선점만을 의미했습니다. 실제 오류에 대해서는 OP가 올바른 사이트에 있습니다. – Rakete1111