C++ 无法将函数定义与模板类中的现有定义相匹配

C++ 无法将函数定义与模板类中的现有定义相匹配,c++,templates,operator-overloading,C++,Templates,Operator Overloading,如果以前有人问过这样的问题,我很抱歉,但无论我搜索了多少,我都找不到(有类似的问题,但似乎没有一个适合我) 我正在编写一个模板类,除了尝试重载操作符+,其他一切都可以正常工作。我尝试为不同的参数重载运算符+两次,但编译器看不到其中一个定义,并给出一个eror。代码如下: Worker.h(我的previos家庭作业之一,在这里实现了这个问题,因为它更容易看到): \ifndef\u工人\u H #定义工人 #包括 #包括“Project.h” 使用名称空间std; 模板 班主任{ 公众: 工人(

如果以前有人问过这样的问题,我很抱歉,但无论我搜索了多少,我都找不到(有类似的问题,但似乎没有一个适合我)

我正在编写一个模板类,除了尝试重载操作符+,其他一切都可以正常工作。我尝试为不同的参数重载运算符+两次,但编译器看不到其中一个定义,并给出一个eror。代码如下:

Worker.h(我的previos家庭作业之一,在这里实现了这个问题,因为它更容易看到):

\ifndef\u工人\u H
#定义工人
#包括
#包括“Project.h”
使用名称空间std;
模板
班主任{
公众:
工人(常量字符串和,项目和);
无效工作(常数和);
const-Worker&Worker::operator+(const-int&);//问题
常量工作者&工作者::运算符+(常量字符串&);//问题
字符串getName()常量;
int getTime()常量;
私人:
字符串myName;//工作人员的名称
Project&myProject;
int myTime;//用于跟踪工作人员工作时间的变量。
};
#包括“Worker.cpp”
#恩迪夫
以及Worker.cpp的相关部分:

template <class T>
const Worker<T> & Worker<T>::operator+(const int & add)
{
  cout << add;
  return *this;
}

template <class T>
const Worker<T> & Worker<T>::operator+(const string & add) 
{
  cout << add;
  return *this;
}
模板
常量工作者和工作者::运算符+(常量int和add)
{

这里有两件事,其中一件是你的问题

成员函数的返回类型不受类是模板这一事实的影响,因此
operator+
returning
Worker
的声明和returning
Worker
的定义是不同的。在类定义中,它们应该是:

const Worker<T> & operator+(const int &); //Problem
const Worker<T> & operator+(const string &); //Problem
const-Worker&operator+(const-int&);//问题
常量工作者和运算符+(常量字符串&);//问题

上述代码中的另一个变化是,在类声明中不需要作用域(
Worker::
),这里有两件事,其中一件是您的问题

成员函数的返回类型不受类是模板这一事实的影响,因此
operator+
returning
Worker
的声明和returning
Worker
的定义是不同的。在类定义中,它们应该是:

const Worker<T> & operator+(const int &); //Problem
const Worker<T> & operator+(const string &); //Problem
const-Worker&operator+(const-int&);//问题
常量工作者和运算符+(常量字符串&);//问题

上述代码中的另一个变化是,在类声明中不需要作用域(
Worker::

您的方法有一些问题,与模板无关

首先您的运算符将只处理一种操作顺序:
Worker+int
,而not
int+Worker

Second通常您希望返回一个新的工作实例,而不是通过引用返回
this
,因为
a+B
不应修改
a
B

因此,您可以为不同的排序定义非成员运算符:

template <typename T>
Worker<T> operator+(int i, const Worker<T>& t) { }

template <typename T>
Worker<T> operator+(const Worker<T>& t, int i) { }
模板
辅助运算符+(int i,const-Worker&t){}
模板
工作者运算符+(常数工作者&t,int i){}
等等


请注意,对于应该影响对象状态的运算符,例如
+=
*=
等,通常的方法是使用成员运算符并通过引用返回,因为在这些情况下,它非常有意义。

您的方法有一些问题,与模板无关

首先您的运算符将只处理一种操作顺序:
Worker+int
,而not
int+Worker

Second通常您希望返回一个新的工作实例,而不是通过引用返回
this
,因为
a+B
不应修改
a
B

因此,您可以为不同的排序定义非成员运算符:

template <typename T>
Worker<T> operator+(int i, const Worker<T>& t) { }

template <typename T>
Worker<T> operator+(const Worker<T>& t, int i) { }
模板
辅助运算符+(int i,const-Worker&t){}
模板
工作者运算符+(常数工作者&t,int i){}
等等


请注意,对于应该影响对象状态的运算符,例如
+=
*=
等,通常的方法是使用成员运算符并通过引用返回,因为在这些情况下,这非常有意义。

不一定与当前问题相关,但不包括标题中的.cpp文件——包括h.cpp文件中的头文件您可以提供有关如何使用类w/运算符以及编译器提供的错误的代码吗?@Attila虽然这是一种非常糟糕的做法,但模板必须完全定义,包括使用前所有函数的代码。这意味着函数代码应该以某种方式出现在头文件中。典型的方法是使用内联文件.inl进行澄清this@AndrewBrock-Thnx,gut reaction:)我不知道.inl实践不一定与手头的问题有关,但不要在头文件中包含.cpp文件--在.cpp文件中包含头文件您可以提供有关如何使用类w/运算符以及编译器提供的错误的代码吗?@Attila虽然这是一种非常糟糕的做法,但在使用之前必须完全定义模板,包括所有函数的代码。这意味着函数代码应该以某种方式出现在头文件中。典型的方法是使用内联文件.inl来澄清this@AndrewBrock-Thnx,肠道反应:)我不知道。在实践中,我知道它不会我不必返回此值,+重载的内容最初不是这样的,我也知道int+Worker是不可能的,实现它的更好方法是一个自由函数,但由于赋值,我需要将其作为一个成员函数。(只询问Worker+int)。但仍然感谢您的回复。我知道它不必返回此内容,+重载的内容最初不是这样,我也知道int+Worker是不可能的,实现此功能的更好方法是免费函数,但因为