具有默认参数和专业化的模板

时间:2019-10-09 10:08:08

标签: c++ c++11 templates template-specialization

我有这段代码:

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中应该是多余的

1 个答案:

答案 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