【发布时间】:2015-06-16 19:09:16
【问题描述】:
我正在制作程序,在该程序中我为向量创建类并重载不同的运算符。现在我想将向量(坐标)的参数作为模板。 当我将所有代码都放在一个文件中时,一切正常并且程序运行正常:
#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
我必须如何做到这一点才能使其正确?
【问题讨论】:
-
对不起,我知道这个骗子并不完美,但我觉得它快到了。为了定义类模板的成员,定义也必须是模板:
template<typename TYPE> VECTOR4D<TYPE> &VECTOR4D<TYPE>::operator+=(VECTOR4D<TYPE> &K) {...}。请注意,K实际上应该是一个 const 引用,因为没有任何改变。您正在阻止调用者传递完全合理的参数。
标签: c++ templates vector overloading operator-keyword