在非模板类中制作朋友模板函数

时间:2013-05-27 20:29:22

标签: c++ templates

我尝试在没有模板的情况下编译我的代码,当我添加模板代码时它工作得很好我得到了2019LNK错误。

我课程开头时有以下内容:

template<typename T>
friend void inchealth(T &,int);

功能声明:

template<typename T>
void inchealth(T &x, int y)
{x.health += y;}

(健康是我班级的成员变量)

编辑这里是确切的代码:

class archer        
{

template <class T>
friend void inchealth(T &,int);

public:
archer(){health = 150; mana = 50; armor = 50; damage = 10;}

int checkhealth() {return health;}
int checkmana() {return mana;}
int checkarmor() {return armor;}
int checkdamage(){return damage;}


private:
int health;
int mana; 
int armor;
int damage;};

template <class T>
void inchealth(T &x, int y)
{x.health += y;}

void main()
{
archer a;
inchealth(a,5);

}

1 个答案:

答案 0 :(得分:2)

我的通灵调试意识表明你已将inchealth的定义放在单独的cpp文件中main

模板化函数体需要在您调用它们的位置可见,或者您需要明确告诉编译器实例化您想要的版本。

所以,如果我是正确的,解决方案是将inchealth的定义移动到定义main的文件中的#include标题,或者添加行

template void inchealth<archer>(archer&,int);

低于定义它的文件中inchealth的定义(假设archer的声明在那里可见)。前者是首选。