【问题标题】:How to use template as argument in constructor while overloading operators? [duplicate]重载运算符时如何在构造函数中使用模板作为参数? [复制]
【发布时间】: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&lt;typename TYPE&gt; VECTOR4D&lt;TYPE&gt; &amp;VECTOR4D&lt;TYPE&gt;::operator+=(VECTOR4D&lt;TYPE&gt; &amp;K) {...}。请注意,K 实际上应该是一个 const 引用,因为没有任何改变。您正在阻止调用者传递完全合理的参数。

标签: c++ templates vector overloading operator-keyword


【解决方案1】:

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

如果你在类声明之外定义模板类方法,你也应该指定模板参数

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多