我有这段代码:
template <class T = double>
class Mat {
};
template <>
class Mat<double> {
};
/*****************************************************************************/
// main
/*****************************************************************************/
int main(int argc, char * const argv []) {
Mat mat1; // work
Mat<Mat> mat2; // error
return 0;
}
使用-std = gnu ++ 17的编译器使我回到“垫子Mat2”上:
“使用类模板'Mat'需要模板参数”
我不明白为什么。
更新:
有人建议我使用符号
Mat<Mat<>>
但是我很确定第二个空<>在C ++ 17中应该是多余的
答案 0 :(得分:1)
从我读过的here来看,由于C ++ 17,如果可以从初始值设定项推论出类型,就不必提供<>
了。因此,如果要在没有<>
的情况下进行推导,则需要一个初始化程序。
因此,正如昆汀在评论中所说的那样,您要么必须要做类似的事情:
Mat<Mat<>> mat2;
或定义一些允许类型推导的构造函数。这是您的处理方法:
template <class T = double>
class Mat
{
public:
Mat(std::initializer_list<T> l) { for (const auto& v : l) std::cout << v << std::endl; }
friend std::ostream& operator<< (std::ostream& os, const Mat<T>& mat) {
os << "Mat object" << endl;
return os;
}
};
int main(int argc, char * const argv[]) {
Mat mat1{ 1.0, 5.6 }; // T = double deduced from initializer list
Mat mat2({ Mat{1.2, 3.6} }); // T = Mat<double> deduced from initizalizer
return 0;
}
结果:
1
5.6
1.2
3.6
Mat object