重载运算符时如何在构造函数中使用模板作为参数?

How to use template as argument in constructor while overloading operators?

我正在制作一个程序,其中我为矢量创建 class 并重载不同的运算符。现在我想将向量(坐标)的参数作为模板。 当我将所有代码都放在一个文件中时,一切正常,程序 运行 正确:

#ifndef VECTOR4D_H_INCLUDED
#define VECTOR4D_H_INCLUDED
template <typename TYPE>
class VECTOR4D{
    public:
       VECTOR4D (void): X(0), Y(0), Z(0), T(0){};
       VECTOR4D (TYPE X, TYPE Y, TYPE Z, TYPE T): X(X), Y(Y), Z(Z), T(T){};
       TYPE X, Y, Z, T;

       VECTOR4D &operator+=(VECTOR4D &K){
           this->X += K.X;
           this->Y += K.Y;
           this->Z += K.Z;
           this->T += K.T;

           return *this;
       }
};


#endif // VECTOR4D_H_INCLUDED

但是当我将重载运算符的实现和声明分开时,我遇到了问题。

//vector4d.h
#ifndef VECTOR4D_H_INCLUDED
#define VECTOR4D_H_INCLUDED
template <typename TYPE>
class VECTOR4D{
    public:
        VECTOR4D (void): X(0), Y(0), Z(0), T(0){};
        VECTOR4D (TYPE X, TYPE Y, TYPE Z, TYPE T): X(X), Y(Y), Z(Z), T(T){};
        TYPE X, Y, Z, T;

        VECTOR4D &operator+=(VECTOR4D &);
};


#endif // VEKTOR4D_H_INCLUDED

//project.cpp
#include <iostream>
#include "vector4d.h"

VECTOR4D &VECTOR4D::operator+=(VECTOR4D &K)
{
    this->X += K.X;
    this->Y += K.Y;
    this->Z += K.Z;
    this->T += K.T;

    return *this;
}

在编译过程中出现错误:

invalid use of template-name 'VECTOR4D' without an argument list

我该怎么做才能使其正确?

VECTOR4D 是一个模板 class。模板 class 的所有方法都必须在头文件中实现(您可以在这里阅读:Why can templates only be implemented in the header file?

如果在 class 声明

之外定义模板 class 方法,您还应该指定模板参数
template<typename TYPE>
VECTOR4D<TYPE> &VECTOR4D<TYPE>::operator+=(VECTOR4D<TYPE> &K)
{
    this->X += K.X;
    this->Y += K.Y;
    this->Z += K.Z;
    this->T += K.T;

    return *this;
}