转换运算符从一个模板化类转换为另一个模板类

时间:2017-05-04 18:23:20

标签: c++ templates conversion-operator

进行了搜索,但无法找到与我的查询匹配的内容,它有点具体,所以这里有。

我有一些模板化的类(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;。它的前瞻声明。我不相信我错过了这么简单的事情。   孩子们:当你如此束缚时不要编码,这样做很好。

2 个答案:

答案 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;
};

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