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

错误例程:

#include<iostream>

using namespace std;

template<class T>
class Student
{
private:
	T age;
public:
	Student(T age_) :age(age_){}
	friend bool operator==(const Student<T>& s1, const Student<T>& s2);
};

int main()
{
	Student<int> s1(1);
	Student<int> s2(2);
	if (s1 == s2)
		cout << "相等" << endl;
	else
		cout << "不相等" << endl;

	cin.get();
	return 0;
}

template<class T>
bool operator==(const Student<T>& s1, const Student<T>& s2)
{
	if (s2.age == s1.age)
	{
		return true;
	}
	return false;
}

今天敲代码时一个类似于上面的程序报错了,报错原因是比较s1和s2的==运算符没有定义。我勒个擦,看了N长时间,愣是没有看出哪里错来,然后就放了放,晚上的时候又问了一个大神,结果大神也没看出来/(ㄒoㄒ)/~~。最后终于发现了,原来是类中的友元函数的声明的参数中的类模板类型直接用的类的模板类型了,没有自己template,编译器检查不出来,导致了类中的友元函数的声明与类外友元函数的实现对接不上,导致了==运算符没有定义的错误。

正确例程:

#include<iostream>

using namespace std;

template<class T>
class Student
{
private:
	T age;
public:
	Student(T age_) :age(age_){}

	template<class T>
	friend bool operator==(const Student<T>& s1, const Student<T>& s2);
};

int main()
{
	Student<int> s1(1);
	Student<int> s2(2);
	if (s1 == s2)
		cout << "相等" << endl;
	else
		cout << "不相等" << endl;

	cin.get();
	return 0;
}

template<class T>
bool operator==(const Student<T>& s1, const Student<T>& s2)
{
	if (s2.age == s1.age)
	{
		return true;
	}
	return false;
}
时间: 2024-09-27 09:36:16

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

在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数

看视频教程说不能在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数 我试了试,可以,放出测试代码: #include <iostream> using namespace std; template<typename T> class A { public: A(T a) { this->a = a; } template<typename T> //加上这句就可以了 friend A<T> operator+(A<T> &

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

模板类的友元函数

非模板友元函数 模板类的非模板友元函数是说该模板类的友元函数只是一个普通函数,并且该函数是非模板函数或该函数不视为模板函数.这里包含了两种情况,下面分别就两个例子进行说明. • 函数是非模板函数 这一类友元函数特点是不带有参数列表,例如:friend void Fn().这类友元函数通常可以用于全局对象的访问. #include <iostream> using namespace std; template <class T> class MyNumber { private:

类模板 友元重载形式 各种运算符重载 new delete ++ = +=

今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢. 一.类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写在类声明中,那么可以跳过该部分. 请看下面这段代码: 头文件: #pragma once template<typename T> class CLA { T m_value; public: CLA(const T&); friend CLA operator+(const CLA&am

类模板和函数模板

函数模板: 函数模板全特化:所谓特化,是指相对普通模板的特化,是另外一个模板.但不是实例,只是模板 template <class T>                                      //普通函数模板,泛型T mymax(const T t1, const T t2){   return t1 < t2 ? t2 : t1;} template <>const char* mymax(const char* t1,const char* t2)  

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

sdut 3-7 类的友元函数的应用

3-7 类的友元函数的应用 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握类的友元函数的定义和用法 要求设计一个点类Point,它具有两个double型的数据成员x,y.为该类设计构造函数.并为其添加一个友元函数用于计算并输出两点间的距离:再添加一个输出成员函数用于输出点的信息. 并编写主函数,实现以下的输入输出内容. 输入 4个double型的数,中间用一个空格间隔. 输出 输出数据共3行,前两行用于显示要求距离的两个点的信息

3-7 类的友元函数的应用

题目描述 通过本题目的练习可以掌握类的友元函数的定义和用法 要求设计一个点类Point,它具有两个double型的数据成员x,y.为该类设计构造函数.并为其添加一个友元函数用于计算并输出两点间的距离:再添加一个输出成员函数用于输出点的信息. 并编写主函数,实现以下的输入输出内容. 输入 4个double型的数,中间用一个空格间隔. 输出 输出数据共3行,前两行用于显示要求距离的两个点的信息,第三行显示两点的距离. 示例输入 5 6 2 3 示例输出 The first point is the

C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化

模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24233693 指针支持隐式转换(implicit conversion), 在动态绑定中,派生类指针能够转换为基类指针. 可是模板的实例化(instantiations)之间, 是单独存在的, 派生类的实例化的模板(SmartPtr<Derived>), 不能转换为基类实例