gpt4 book ai didi

C++模板类友元运算符重载

转载 作者:太空狗 更新时间:2023-10-29 21:48:02 26 4
gpt4 key购买 nike

我正在尝试制作一个通用 vector 类,既是为了我自己的代码片段库,也是为了练习模板类。本质上,Vector 类是模板化的,允许您选择它的精度是 float、double、long double 等。

我遇到的问题是为了缩放 vector 而重载 * 运算符。排除所有工作重载和成员函数后,类定义如下所示:

#pragma once

#include <math.h> // for sqrt function when normalizing

template <typename T> class Vector;
template <typename T> Vector<T> operator*(const Vector<T>& obj);

template <typename T> class Vector {
private:
// Attributes:
static const int DIMS = 3;
T component[DIMS];

public:
enum {
X, Y, Z
};

public:
// Constructors:
Vector(void) {
for (int i=0; i<DIMS; ++i) {
component[i] = T();
}
}
Vector(T x, T y, T z) {
component[X] = x;
component[Y] = y;
component[Z] = z;
}

// Destructor:
~Vector(void) { }

// Scaling:
friend Vector<T> operator*(const Vector<T>& obj);
Vector operator*(const T scale) {
Vector<T> result = Vector<T>();

for (int i=0; i<DIMS; ++i) {
result.component[i] = component[i] * scale;
}

return result;
}
};

template <typename T>
Vector<T> operator*(const Vector<T>& obj) {
Vector<T> result = Vector<T>();

for (int i=0; i<DIMS; ++i) {
result.component[i] = obj.component[i] * this*;
}

return result;
}

在我的 main 方法中,我有以下几行代码:

Vector<float> testVector1 = Vector<float>(1.0f, 0.0f, 0.0f);
Vector<float> testVector2 = Vector<float>(0.0f, 1.0f, 0.0f);
Vector<float> testVector3 = 10.0f * testVector1;
Vector<float> testVector4 = testVector2 * 10.0f;

除了一个错误之外,一切都编译得很好:虽然 main() 中的第四行工作正常(将 vector 乘以标量),但第三行(将标量乘以 vector )给了我错误:

Error 1 error C2677: binary '*' : no global operator found which takes type 'Vector ' (或没有可接受的转换)

我对这个问题的最佳猜测是编译器不知道我试图重载哪个原语的 * 运算符,我不能直接告诉它,因为类在传递到模板。有没有办法完成我正在尝试做的事情,或者模板必须始终遵循运算符重载的类?

更新:因此,多亏了 jwismar 和其他人,我捕获了左手重载的糟糕尝试。类中函数的定义现在是:

friend Vector<T> operator*(T scalar, const Vector<T>& obj);

它的实现是:

template <typename T> 
Vector<T> operator*(T scalar, const Vector<T>& obj) {
Vector<T> result = Vector<T>();

for (int i=0; i<DIMS; ++i) {
result.component[i] = obj.component[i] * scalar;
}

return result;
}

类上面重载的初始声明现在是 template Vector operator*(T scalar, const Vector & obj); ,但我得到了无论是否被注释掉,都会出现同样的错误。

现在我要讨论一个关于模板和运算符重载的更具体的问题。编译器现在停止编译,尽管错误现在是 Unresolved external 错误:

Error 1 error LNK2019: unresolved external symbol "class Vector __cdecl operator*(float,class Vector const &)"(??D@YA?AV?$Vector@M@@ MABV0@@Z) 在函数_main C:\Users\D03457489\Desktop\UVCTester\UVCTester\main.obj UVCTester中引用的引用

所以编译器告诉我它可以找到 operator*(float, Vector ) 的定义,但找不到实现。所以新的问题是:这是我的另一个基本疏忽的结果,还是不能以这种方式使用模板来生成操作数左侧未知的运算符重载?

最佳答案

不是第 4 行有错误,而是第 3 行。编译器正在寻找一个在左侧有一个 float 的内置函数,但它找不到。您将需要定义一个自由函数,例如:

template <typename T> Vector<T> operator*(T scalar, const Vector<T>& obj);

关于C++模板类友元运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com