从陌生模板类型转换

Conversion from strange template type

本文关键字:类型转换      更新时间:2023-10-16

我有一些向量(数学类型)实现为结构体。有一个基本的Vector,它是一个模板,然后是这个模板的多个实现,用于不同维度的向量:

template<unsigned int D>
struct Vector
{
    float values[D];
    inline Vector<D> operator*(const Vector<D>& v) const
    {
        Vector<D> result;
        for (unsigned int i = 0; i < D; i++)
            result[i] = values[i] * v[i];
        return result;
    }
    float operator[](unsigned int i) const
    {
        return values[i];
    }
};

我只包含了一个操作符,但显然还有其他的和各种方法来取点积等。然后我有这样的实现:

struct Vector2 : Vector<2>
{
    Vector2(float x = 0, float y = 0) : Vector<2>()
    { }
};

然后我有两个Vector2,我试图对它们使用乘法运算符:Vector2 textureOffsetPixels = textureOffset * textureSampleSize;

抛出错误:conversion from Vector<2u> to non-scalar type 'Vector2' requested。什么是Vector<2u>,为什么这不起作用?这两个变量的显式类型为Vector2

为了能够将textureOffset * textureSampleSize的结果(即Vector<2>)转换为Vector2,您需要一个转换函数。这样的构造函数就足够了:

Vector2(const Vector<2> &base) : Vector<2>(base) {}

错误提到Vector<2u>,因为模板参数是unsigned int,所以2被隐式转换为2u

您的operator *返回Vector<2>,而不是Vector2。下面的命令可以工作:

Vector<2> a, b, c;
c = a * b;