gpt4 book ai didi

c++ - 具有默认参数和特化的模板

转载 作者:行者123 更新时间:2023-11-30 04:43:25 24 4
gpt4 key购买 nike

我有这段代码:

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 的编译器返回“Mat mat2”:

“使用类模板‘Mat’需要模板参数”

我不明白为什么。

更新:

有人建议我使用符号

Mat<Mat<>>

但是我很确定第二个空 <> 在 C++17 中应该是多余的

最佳答案

从我读到的here , 因为 C++17 你不需要提供 <>如果可以从初始值设定项中推导出类型,就可以了。所以如果你想在没有 <> 的情况下扣除,你需要一个初始化器.

所以你要么必须做类似的事情,正如 Quentin 在评论中所说:

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

关于c++ - 具有默认参数和特化的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58301784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com