我想在模板类中为 T 的不同情况定义一个函数。我的问题是定义 T 是向量的情况(无论它包含什么)。
这是我的第一次尝试:
template<typename T>
class Test{
protected:
T *val;
public:
Test(T* v):v(val){};
static string typeName();
};
template<typename T>
string Test<T>::typeName(){
return "other";
}
template<>
string Test<int>::typeName(){
return "int";
}
template<typename T>
string Test<vector<T>>::typeName(){
//error: invalid use of incomplete type ‘class Test<vector<T>>’
return "vector<" + Test<T>::typeName() + ">";
}
我可以通过定义来解决这个错误:
template<typename T>
class Test<vector<T>>{
// ... (the same thing)
}
但我不想这样做,因为我的班级很大,我不想再次编写相同的函数。如果可能的话,我还想避免让我的类从另一个类继承。
通过在这里搜索,我了解了 SFINAE,但我是它的初学者。我尝试了所有可能的方法,但没有任何效果。这是另一个尝试:
#include <type_traits>
template<typename T,typename E=void>
class Test{
protected:
T *val;
public:
Test(T* v);
static string typeName();
static void bidon();
};
template<typename T,typename E>
string Test<T,E>::typeName(){
return "other";
}
template<>
string Test<int>::typeName(){
return "int";
}
template<typename T> struct IsVector : public std::false_type{};
template<typename T> struct IsVector<vector<T>> : public std::true_type {};
template<typename T,typename E>
string Test<T,typename std::enable_if<IsVector<T>::value,E>::type>::typeName(){
return "vector<" + Test<typename T::value_type>::typeName() + ">";
}
我有同样的错误。它出什么问题了 ?我在尝试做不可能的事情吗?