关闭

类模板与友元函数链接问题

标签: c++友元函数模板类
883人阅读 评论(0) 收藏 举报
分类:
测试环境:windows 7 vs2013

1.代码

#include<iostream>

template<class T>
class Test
{
private:
	T m_x;

public:
	friend void print(const Test<T> &test);
	Test(T x) :m_x(x)
	{
	}
};
template<class T>
 void print(const Test<T> &test)
{
	std::cout << test.m_x<< std::endl;
};
int main()
{
	Test<int> test(1);
	print(test);

	std::cin.get();
	return 0;
}

上面的程序编译没有问题,链接时候会报如下的错误,错误    2    error LNK1120: 1 个无法解析的外部命令,错误  1  error LNK2019: 无法解析的外部符号 "void __cdecl print(class Test<int> const &)" (?print@@YAXABV?$Test@H@@@Z),该符号在函数 _main 中被引用 。

解决办法有两种

1.将友元函数放入函数内部

#include<iostream>

template<class T>
class Test
{
private:
	T m_x;

public:
	friend void print(const Test<T> &test)
	{
		std::cout << test.m_x << std::endl;
	}
	Test(T x) :m_x(x)
	{
	}
};

int main()
{
	Test<int> test(1);
	print(test);

	std::cin.get();
	return 0;
}

2.仍旧放在外部,采取声明等方式

#include<iostream>

template<class T>
class Test;
template<class T>
void print(const Test<T> &test);

template<class T>
class Test
{
private:
	T m_x;

public:
	friend void print<T>(const Test<T> &test);//这里<T>必不可少
	Test(T x) :m_x(x)
	{
	}
};
template<class T>
 void print(const Test<T> &test)
{
	std::cout << test.m_x<< std::endl;
};
int main()
{
	Test<int> test(1);
	print(test);

	std::cin.get();
	return 0;
}

0
0
查看评论

类模板友元函数坑死人不偿命的错误

错误例程: #include using namespace std; template class Student { private: T age; public: Student(T age_) :age(age_){} friend bool operator==(const S...
  • linukey
  • linukey
  • 2015-06-04 21:33
  • 553

C++类模板及友元类模板,友元函数模板

C++类模板友元分为以下几种情况1.非模板友元类或友元函数。 书上给了一个例子:class Foo{    void bar();};template class QueueItem{    friend class foobar;...
  • hyf62399
  • hyf62399
  • 2010-04-03 23:34
  • 1499

在类模板中使用友元函数的问题

声明:未经允许,不得转载 结合所学知识,记录笔记; (1)将友元函数写在模板的类的内部,不会有什么问题 #define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; template class Comple...
  • qq_34232889
  • qq_34232889
  • 2017-07-10 15:22
  • 162

C++之模板(友元函数+友元类+静态Static)

友元函数 友元函数分为友元全局函数和友元成员函数。 下面是一个友元全局函数的例子:class Coordinate { friend void printXY(Coordinate &c);public: Coordinate(int x, int y);private...
  • u013486414
  • u013486414
  • 2017-03-05 20:57
  • 503

试图对C++友元函数,静态成员函数做个小结

友元函数个人小结
  • ghostjlq
  • ghostjlq
  • 2014-12-13 22:28
  • 665

模板类中包含模板类友元和其他友元函数

发表一点自己对 《C++ Primer 5th》模板那块的理解, 欢迎指正一对一友好关系在类模板与另一个模板(模板类或模板函数)间建立对应实例及其友好关系,为了在类模板中引用另一个类模板或函数的一个特定实例,必须先声明另一个模板: 方便理解和叙述,将含友元的类称为主类,将要做友元类的模板类称为客类...
  • wy11933
  • wy11933
  • 2017-05-03 22:02
  • 573

成员函数、友元函数和一般函数的区别-时间

/* *Copyright (c) 2016 *All rights reserved. *文件名称:test.cpp *作 者:史红浩 *完成日期:2016年 5 月 9 日 *版 本 号:v1.0 */ #include...
  • jiaowohaohao
  • jiaowohaohao
  • 2016-05-09 12:13
  • 1925

学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案

今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题。 大致代码如下 template class chainList : public linearList { friend ostream& operator & rhs); publ...
  • sinat_35261315
  • sinat_35261315
  • 2016-10-18 21:25
  • 976

C++中友元函数和成员函数的区别

什么是友元函数:     指某些虽然不是类的成员却能够访问类的所有成员的函数 为什么要使用:     为了使其他类的成员函数来访问该类的私有变量 什么时候使用:     可以用于运算符重载     两个类...
  • dandanzmc
  • dandanzmc
  • 2013-09-13 21:24
  • 3305

C++类模板中的友元函数的声明和定义分别放在哪里

前面提到了模板的声明和定义推荐都放在头文件中,那么该类中的友元函数的声明和定义该放在哪里呢?         因为友元函数并不属于这个类, 按照习惯,我们一般把声明放在类中,而把定义放在类的外面。但对于类模板来说,这样就出问题了。很多编译...
  • u013403052
  • u013403052
  • 2016-10-14 18:36
  • 1713
    个人资料
    • 访问:297291次
    • 积分:4793
    • 等级:
    • 排名:第7123名
    • 原创:192篇
    • 转载:61篇
    • 译文:0篇
    • 评论:55条
    最新评论