不同类型的运算符
Operator with different types
我是 C++ 的新手,我正在实现一个非常简单的(线性代数)向量 class 作为模板。
现在,我正在尝试实现加法和减法运算符,但不仅能够在向量之间执行运算,而且能够使用标量(短、长、浮点、双精度等)执行运算(这将是逐元素操作)。
代码的相关部分可以在下面看到,模板 class 的声明和定义(实现)都在同一个 .hpp
文件中(检查 问题和由于这个确切原因,似乎没有提供解决方案。
// Forward declaration of friend function
template<class S, class T>
Vector<T> operator +(const S& scalar, const Vector<T>& vec);
template<class T>
class Vector {
public:
Vector(unsigned long length);
Vector(Vector<T> vec);
template<class S>
friend Vector<T> operator +(const S& scalar, const Vector<T>& vec);
template<class S>
Vector<T> operator +(const S& scalar) const;
template<class S>
Vector<T>& operator +=(const S& scalar);
private:
unsigned long mLen;
T* mData;
};
// Constructor
Vector<T>::Vector(const unsigned long length) : mLen(length) {
mData = new T[mData];
for(unsigned long i = 0; i < mLen; ++i) {
mData[i] = T();
}
}
// Copy constructor
template<class T>
Vector<T>::Vector(Vector<T> vec) {
mLen = 0;
mData = nullptr;
std::swap(mData, vec.mData);
}
// Implementation of the operators
template<class S, class T>
Vector<T> operator +(const S& scalar, const Vector<T>& vec) {
return vec + scalar;
}
template<class T> template<class S>
Vector<T> operator +(const S& scalar) const {
Vector<T> result(*this);
return result += scalar;
}
template<class T> template<class S>
Vector<T>& Vector<T>::operator +(const S& scalar) {
// mLen is the length of the object (member variable)
for(unsigned long i = 0; i < mLen; ++i) {
mData[i] += scalar; // mData is the array holding the values (member variable)
}
return *this;
}
Vector 和标量之间的加法已实现(虽然作为成员函数)并按预期工作(结果方面)。此外,我可以保证(至少目前)S
将始终是 short
、int
、float
或 double
.[=20 之一=]
所以,在我的测试中,我尝试做类似
的事情
Vector<int> vec(10);
1 + vec;
我收到以下错误
Undefined symbols for architecture x86_64:
"operator+(int const&, Vector const&)", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我正在为这个项目开发 XCode 11.3.1。
非常欢迎任何见解。此外,我知道我对模板(以及更多关于 C++ 的知识)的理解仍然非常有限,所以如果您需要更多信息以获得更好的想法,请告诉我。
提前致谢。
首先,自由函数模板不需要是 friend
,因为它不直接访问 Vector<T>
中的 private
成员。它也不需要预先声明。这也可以通过使用 std::vector<T>
来保持数据不必手动实施 the rule of 5 来大大简化。
示例:
#include <vector>
template<class T>
class Vector {
public:
Vector(unsigned long length) :
mData(length) // create the vector
{}
template<class S>
Vector& operator+=(S scalar) {
for(auto& v : mData) v += scalar; // add "scalar" to all elements in the vector
return *this;
}
template<class S>
Vector operator+(S s) const {
Vector copy(*this); // using the implicitly defined copy constructor
copy += s; // use the above operator+=
return copy;
}
private:
std::vector<T> mData;
};
template<class S, class T>
Vector<T> operator +(S scalar, const Vector<T>& vec) {
return vec + scalar;
}
我是 C++ 的新手,我正在实现一个非常简单的(线性代数)向量 class 作为模板。
现在,我正在尝试实现加法和减法运算符,但不仅能够在向量之间执行运算,而且能够使用标量(短、长、浮点、双精度等)执行运算(这将是逐元素操作)。
代码的相关部分可以在下面看到,模板 class 的声明和定义(实现)都在同一个 .hpp
文件中(检查
// Forward declaration of friend function
template<class S, class T>
Vector<T> operator +(const S& scalar, const Vector<T>& vec);
template<class T>
class Vector {
public:
Vector(unsigned long length);
Vector(Vector<T> vec);
template<class S>
friend Vector<T> operator +(const S& scalar, const Vector<T>& vec);
template<class S>
Vector<T> operator +(const S& scalar) const;
template<class S>
Vector<T>& operator +=(const S& scalar);
private:
unsigned long mLen;
T* mData;
};
// Constructor
Vector<T>::Vector(const unsigned long length) : mLen(length) {
mData = new T[mData];
for(unsigned long i = 0; i < mLen; ++i) {
mData[i] = T();
}
}
// Copy constructor
template<class T>
Vector<T>::Vector(Vector<T> vec) {
mLen = 0;
mData = nullptr;
std::swap(mData, vec.mData);
}
// Implementation of the operators
template<class S, class T>
Vector<T> operator +(const S& scalar, const Vector<T>& vec) {
return vec + scalar;
}
template<class T> template<class S>
Vector<T> operator +(const S& scalar) const {
Vector<T> result(*this);
return result += scalar;
}
template<class T> template<class S>
Vector<T>& Vector<T>::operator +(const S& scalar) {
// mLen is the length of the object (member variable)
for(unsigned long i = 0; i < mLen; ++i) {
mData[i] += scalar; // mData is the array holding the values (member variable)
}
return *this;
}
Vector 和标量之间的加法已实现(虽然作为成员函数)并按预期工作(结果方面)。此外,我可以保证(至少目前)S
将始终是 short
、int
、float
或 double
.[=20 之一=]
所以,在我的测试中,我尝试做类似
的事情Vector<int> vec(10);
1 + vec;
我收到以下错误
Undefined symbols for architecture x86_64: "operator+(int const&, Vector const&)", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
我正在为这个项目开发 XCode 11.3.1。
非常欢迎任何见解。此外,我知道我对模板(以及更多关于 C++ 的知识)的理解仍然非常有限,所以如果您需要更多信息以获得更好的想法,请告诉我。
提前致谢。
首先,自由函数模板不需要是 friend
,因为它不直接访问 Vector<T>
中的 private
成员。它也不需要预先声明。这也可以通过使用 std::vector<T>
来保持数据不必手动实施 the rule of 5 来大大简化。
示例:
#include <vector>
template<class T>
class Vector {
public:
Vector(unsigned long length) :
mData(length) // create the vector
{}
template<class S>
Vector& operator+=(S scalar) {
for(auto& v : mData) v += scalar; // add "scalar" to all elements in the vector
return *this;
}
template<class S>
Vector operator+(S s) const {
Vector copy(*this); // using the implicitly defined copy constructor
copy += s; // use the above operator+=
return copy;
}
private:
std::vector<T> mData;
};
template<class S, class T>
Vector<T> operator +(S scalar, const Vector<T>& vec) {
return vec + scalar;
}