我有一个模板类Matrix。我想专门为类型复杂的函数,其中T可以是任何东西。我试过这个:
6 template <typename T>
7 class Matrix {
8 public :
9 static void f();
10 };
11 template<typename T> void Matrix<T>::f() { cout << "generic" << endl; }
12 template<> void Matrix<double>::f() { cout << "double" << endl; }
13 template<typename T> void Matrix<std::complex<T> >::f() { cout << "complex" << endl; }
第13行无法编译。我怎么能这样做?
答案 0 :(得分:3)
在第11行和第12行中,您已声明C ++ Standard 14.7 / 3允许的类模板成员的显式特化(14.5.2 / 2也包含一个很好的示例)。在第13行中,您尝试部分专门化一个类模板,这在此表单中是不允许的(这是部分特化,因为您不知道整个类型std::complex<T>
,因为它仍然取决于T
)。你应该对整个班级进行部分专业化。
答案 1 :(得分:1)
事实上,我通过Boost找到了一种聪明的方法。因为我不希望我的库依赖于Boost,所以代码如下:
template <class T, T val> struct integral_constant
{
typedef integral_constant<T, val> type;
typedef T value_type;
static const T value = val;
};
typedef integral_constant<bool, true> true_type;
typedef integral_constant<bool, false> false_type;
template <typename T> struct is_complex : false_type{};
template <typename T> struct is_complex<std::complex<T> > : true_type{};
template <typename T>
class Matrix {
public :
static void f() { f_( typename is_complex<T>::type() ); }
private :
static void f_( true_type ) { cout << "generic complex" << endl; }
static void f_( false_type ) { cout << "generic real" << endl; }
};
template<> void Matrix<double>::f() { cout << "double" << endl; }
这样,我可以使用函数重载和模板来实现我的目标。
答案 2 :(得分:0)
如链接答案中所述,您需要做的是专门化整个班级,而不是简单的功能:
#include <iostream>
#include <complex>
using namespace std;
template <typename T>
class Matrix {
public :
static void f();
};
template<typename T> void Matrix<T>::f() { cout << "generic" << endl; }
template<> void Matrix<double>::f() { cout << "double" << endl; }
template <typename T>
class Matrix<std::complex<T> > {
public:
static void f() { cout << "complex" << endl; }
};
int main(void) {
Matrix<complex<double> >::f();
return 0;
}