不同类型的运算符

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 将始终是 shortintfloatdouble.[=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;
}