进行了搜索,但无法找到与我的查询匹配的内容,它有点具体,所以这里有。
我有一些模板化的类(Vector2,Vector3和Vector4)。 尝试将Vector2中的转换运算符定义为3和4, 和Vector3到2和4等
template <typename T>
class Vector4 {
// ...
operator Vector2<T>() const { return { x, y }; }
operator Vector3<T>() const { return { x, y, z }; }
// ...
T x, y, z, w;
// ...
}
template <typename T>
class Vector3 {
// ...
operator Vector2<T>() const { return { x, y }; }
operator Vector4<T>() const { return { x, y, z, 0 }; }
// ...
T x, y, z;
// ...
}
template <typename T>
class Vector2 {
// ...
operator Vector3<T>() const { return { x, y, 0 }; }
operator Vector4<T>() const { return { x, y, 0, 0 }; }
// ...
T x, y;
// ...
}
使用Visual Studio 2017给我这个:
错误C2833:&#39;运算符Vector2&#39;不是公认的运营商或类型
任何,所有的帮助表示赞赏。
谢谢。
编辑:我的实际来源在课后defs确实有分号。忘了把它们放在我发布的简短版本中。 此外,是的,有很多错误,但根据我的经验,它通常是第一个重要的错误 试图向前宣布:
template <class T> class Vector 3;
template <class T> class Vector 4;
template <typename T>
class Vector2 {
// ...
}
编辑:现在我收到错误C2988:无法识别的模板声明/定义。值得一提的是,3个模板类位于不同的文件中。我最初尝试在一个类中包含一个标题以使类型转换运算符正常工作,这就是原始错误。
哦,是的。我一定会明确地说明这些。这总是很好的建议。虽然是当地时间0430 ...:)
编辑:没关系,我是一个spaz。我不知道我是如何在Vector和dims之间滑动一个空间的&#34; Vector 2&#34; !=&#34; Vector2&#34;。它的前瞻声明。我不相信我错过了这么简单的事情。 孩子们:当你如此束缚时不要编码,这样做很好。
答案 0 :(得分:1)
当您声明Vector4<T>::operator Vector2<T>() const;
之前,您正在使用课程Vector2<T>
,然后才宣布它。 Vector4<T>::operator Vector3<T>() const;
也发生了同样的事情。转发首先声明您的课程。
// Forward declarations
template<class T> class Vector2;
template<class T> class Vector3;
template <typename T>
class Vector4 {
// ...
operator Vector2<T>() const { return{ x, y }; }
operator Vector3<T>() const { return{ x, y, z }; }
// ...
T x, y, z, w;
// ...
};
template <typename T>
class Vector3 {
// ...
operator Vector2<T>() const { return{ x, y }; }
operator Vector4<T>() const { return{ x, y, z, 0 }; }
// ...
T x, y, z;
// ...
};
template <typename T>
class Vector2 {
// ...
operator Vector3<T>() const { return{ x, y, 0 }; }
operator Vector4<T>() const { return{ x, y, 0, 0 }; }
// ...
T x, y;
// ...
};
答案 1 :(得分:0)
你有循环依赖 您可以通过在一个“方向”中使用转换构造函数来解决它 这个使用构造函数来增加维度,使用转换运算符来减少它们:
template <typename T>
class Vector2 {
T x, y;
};
template <typename T>
class Vector3 {
Vector3(const Vector2<T>& v2) : x(v2.x), y(v2.y), z(0) {}
operator Vector2<T>() const { return { x, y }; }
T x, y, z;
};
template <typename T>
class Vector4 {
Vector4(const Vector2<T>& v2) : x(v2.x), y(v2.y), z(0), w(0) {}
Vector4(const Vector3<T>& v3) : x(v3.x), y(v3.y), z(v3.z), w(0) {}
operator Vector2<T>() const { return { x, y }; }
operator Vector3<T>() const { return { x, y, z }; }
T x, y, z, w;
};
(在此处插入关于隐式转换的危险的严厉警告。)