从奇怪的模板类型转换

时间:2015-07-06 19:51:27

标签: c++ templates types

我有许多以结构形式实现的向量(数学类型)。有一个基础.bash_profile,它是一个模板,然后这个模板的多个实现用于不同维度的向量:

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>

2 个答案:

答案 0 :(得分:3)

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

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

该错误提及Vector<2u>,因为模板参数为unsigned int,因此2会隐式转换为2u

答案 1 :(得分:0)

您的operator *返回Vector<2>,而不是Vector2。以下内容适用:

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