1

进行了搜索,但找不到与我的查询匹配的内容,它有点具体,所以就这样吧。

我有一些模板类(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:“运算符 Vector2”不是可识别的运算符或类型

任何和所有的帮助表示赞赏。

谢谢你。

编辑:我的实际来源在类定义后确实有分号。忘了把它们放在我发布的简短版本中。另外,是的,有很多错误,但根据我的经验,它通常是第一个重要的尝试向前声明:

template <class T> class Vector 3;
template <class T> class Vector 4;

template <typename T> 
class Vector2 {
// ...
}

编辑:现在我收到错误 C2988:无法识别的模板声明/定义。可能值得一提的是,这 3 个模板类位于不同的文件中。我最初尝试在一个类中包含一个标题以使类型转换运算符正常工作,这就是造成原始错误的原因。

哦是的。我一定会把这些说清楚。这总是很好的建议。虽然是当地时间 0430... :)

编辑:没关系,我是一个spaz。我不知道我是如何在 Vector 和暗淡数量“Vector 2”!=“Vector2”之间插入一个空格的。前向声明它是。不敢相信我错过了这么简单的事情。孩子们:当你被束缚时不要编码,这很好。

4

2 回答 2

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;
    // ...
};
于 2017-05-04T18:30:52.583 回答
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;
};

(在此处插入关于隐式转换危险的严厉警告。)

于 2017-05-04T18:31:04.740 回答