参数包构造函数在类模板中隐藏用户定义的转换
Parameter pack constructor hiding user defined conversion in class template
我正在为数学向量编写一个简单的类模板。我在模板中有一个使用参数包的构造函数模板,以便可以使用可变数量的参数构造向量:
template <unsigned int N, typename T>
class Vec
{
public:
T m_components[N];
Vec()
: m_components{}
{ }
template<typename ...Args>
explicit Vec(Args... args)
: m_components{args...}
{ }
// ...
}
我还添加了用户定义的转换,以使用此模板在类之间进行转换:
// ...
template <unsigned int _N, typename _T>
explicit operator Vec<_N, _T> () const
{
Vec<_N, _T> vec;
for(unsigned int i = 0; i < N && i < _N; ++i)
vec.m_components[i] = static_cast<_T>(m_components[i]);
return vec;
}
// ...
但是,当我调用用户定义转换时,我是这样写的:
Vec<2, int> a(2, 8);
Vec<4, double> b;
b = (Vec<4, double>)a;
使用 C 样式转换的行会导致以下错误:
C2440: 'initializing': cannot convert from 'Vec<2, int>' to 'T' // points to the expansion of the parameter pack: m_components{args...}
当我单步执行代码时,我可以看到 C 样式强制转换直接进入参数包构造函数。为什么会这样,我做错了什么?如何防止参数包构造函数看似隐藏用户定义的转换?
添加此构造函数:
// ...
template <unsigned int _N, typename _T>
explicit Vec(const Vec<_N, _T>& other)
{
for(unsigned int i = 0; i < N && i < _N; ++i)
m_components[i] = static_cast<_T>(other.m_components[i]);
}
// ...
据我了解,我在这里可能大错特错(有更多专业知识的人可以更好地解释(,编译器不知道如何修改模板类的当前实例以便与另一个实例一起分配。
m_components
在施工期间以固定大小分配。即使使用过载铸造操作员,您也只完成了一半的工作。必须有某种机制来修改当前实例,以接受来自另一个实例的数据。
相关文章:
- C++如何通过用户输入删除列表元素
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 参数包构造函数在类模板中隐藏用户定义的转换
- 如何根据用户输入在OpenGL中显示/隐藏点
- 打开第二个窗口后隐藏主窗口?另外,当用户关闭第二个窗口时,主窗口如何重新出现
- 解决隐藏歧义的不明确用户定义转换
- 隐藏库用户的库依赖关系
- 如何在正常用户环境中以编程方式隐藏 Windows 8 上的任务栏
- 对用户隐藏类的构造
- 对模板类的用户隐藏模板类使用的#include
- 如何对其他用户隐藏一个秘密
- 在windows移动平台隐藏基于对话框的应用程序后,用户无法再激活它