gpt4 book ai didi

c++ - 从部分专用模板类创建对象

转载 作者:搜寻专家 更新时间:2023-10-31 00:16:45 26 4
gpt4 key购买 nike

如何创建标记为 WRONG 的对象?它是一个部分专用的模板类。

template<typename C, typename size_type = unsigned short>
struct MatrixDataRect {...};

template<typename T, size_t H, size_t W>
class MatrixDataRect<std::array<T,H*W>, size_t> {...};

int main()
{
MatrixDataRect<std::vector<double>> mat_data_vector;
MatrixDataRect<std::array<double,10*5>> mat_data_array; // WRONG!!!!
return 0;
}

这是错误的,因为错误的行使用了第一个模板类。不是第二。因为编译器无法将 10*5 分别赋值给 H 和 W。

最佳答案

template<typename T, size_t H, size_t W>
class MatrixDataRect<std::array<T,H*W>, size_t> {...};
MatrixDataRect<std::array<double,10*5>> mat_data_array;

问题是模板参数 H 和 W 不能从调用位置推导出来。基本上,在实例化期间,编译器将乘以 5*10产量 50然后尝试实例化 std::array<double,50> ,然后使用实例化类型来实例化 MatrixDataRect<std::array<double,50>> .此时无法弄清楚 H 的值是什么和 W用于 MatrixDataRect (是 5 和 10?,10 和 5?,25 和 2?...)

由于无法应用类型推导,编译器将回退到非专用版本并实例化主模板。

您可以使用的替代方案是:使特化采用 std::array和一个大小参数(作为主模板)。这适用于问题中的所有代码,如果您需要两个维度,则可能不适用于其他成员。更改模板,以便显式传递尺寸。

关于c++ - 从部分专用模板类创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15189258/

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