我當前的代碼看起來像如下:Code here如何讓內部模板類是外部模板類的類型?
我有一個模板ClassOuter
和嵌套模板ClassInnerBase
,其中TypeD
可以是任何類型的TypeA, TypeB, TypeC
並沒有其他的。此外,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