【发布时间】:2017-05-04 18:23:20
【问题描述】:
进行了搜索,但找不到与我的查询匹配的内容,它有点具体,所以就这样吧。
我有一些模板类(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:'operator Vector2' 不是可识别的运算符或类型
感谢所有帮助。
谢谢。
编辑:我的实际来源在类定义后确实有分号。忘了把它们放在我发布的简短版本中。 另外,是的,有很多错误,但根据我的经验,这通常是第一个重要的 尝试向前声明:
template <class T> class Vector 3;
template <class T> class Vector 4;
template <typename T>
class Vector2 {
// ...
}
编辑:现在我收到错误 C2988:无法识别的模板声明/定义。可能值得一提的是,这 3 个模板类位于不同的文件中。我最初尝试在一个类中包含一个标题以使类型转换运算符正常工作,这就是导致原始错误的原因。
哦,是的。我一定会把这些说清楚。这总是很好的建议。不过现在是当地时间 0430... :)
编辑:没关系,我是个垃圾。我不知道我是如何在 Vector 和暗淡数量“Vector 2”!=“Vector2”之间插入一个空格的。前向声明它是。不敢相信我错过了这么简单的事情。 孩子们:当你被束缚时不要编码,这很好。
【问题讨论】:
-
您可能需要考虑声明这些运算符
explicit。 -
它应该提供更多的错误信息。我可以看到你应该在哪里得到至少 10... 用分号关闭类定义。编译器在声明之前无法识别类型。
标签: c++ templates conversion-operator