C++:模板友元

模板友元函数在类内声明类外定义时都必须加模板前缀,另外模板要写在一个文件内

// generates undefined error for the operator<< function
#ifndef ARRAY_H
#define ARRAY_H
#include <iosfwd>

#include <stdlib.h>
#include <iostream>

template<class T> class array {
	int size;
public:
	array();
	template<class T> friend std::ostream&               //不要少了template<class T>
		operator<<(std::ostream&, const array<T>&);
};

template<class T> array<T>::array() { size = 1024; }

template<class T>  std::ostream&
	operator<< (std::ostream& out, const array<T>& rhs)
{
	return out << ‘[‘ << rhs.size << ‘]‘;
}

#endif

C++:模板友元

时间: 2024-07-30 23:00:00

C++:模板友元的相关文章

函数模板友元

;函数模板友元 (即一个类友元的是一个全局函数模板而不是原先的全局函数,需注意类模板传入的类型) 标准带类模板参数 friend void fun1(A<T>& obj); 指定这个A<T>类型的模板有一个这样的朋友函数,那么也就意味着这个函数内部只能由A<T>类型的模板 实例化的类 实例化出来的对象可以访问这个对象的数据成员,不是这个类型的类模板就不能访问 ;code template<typename T> class A{ public: A(

【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() //类模板成员函数在外部,需要加载类型初始

模板类的约束模板友元函数:template friend functions

本来这篇博客是不打算写的,内容不是很难,对于我自己来讲,更多的是为了突出细节. 所谓template friend functions,就是使友元函数本身成为模板.基本步骤:1,在类定义的前面声明每个模板函数.eg:template <typename T> void counts(); template <typename T> void report<>(T &);2,在类声明中再次将模板声明为友元. template <typename TT>

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

错误例程: #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() { Studen

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

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

[基础] 模板+友元类外定义

下面这种定义方式会报错: Undefined symbols for architecture x86_64 template <typename T> class longint{ public: T num; longint (T a = 0) { num = a; } friend ostream& operator<< (ostream& out, const longint<T>& Lint); ~longint (){ ; } pri

friend keyword 对于模板 并不只不过友元!!!

friend是C++中封装的漏网之鱼. C++中的friend同意其它的类或者是函数訪问本类的不论什么成员.甚至是private成员,仅仅要该类声明其为友元. 但是,在有些情况下,并非同意外界訪问类的内部实现而使用友元. 这就是在 "模板定义" 与 "隐式类型转换" 之间的一个trick了. 首先,看一个简单的有理数的模板类.该类定义了有理数,而且实现有理数的乘法. 注:下述代码中,将operator*声明为非成员函数.是由于 "假设你须要对成员函数全部的

模板类和友元

非模板友元 template<typename T> class HasFriend { public: friend void report(HasFriend<T>&); }; // the following code is necessary void report(HasFriend<int>& hf) { //details } void report(HasFriend<double>& hf) { //details

C++中模板类使用友元模板函数

在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定实例的访问权的友元声明. (1)普通友元: template<class T> class A{ friend void fun(); //... };此例中fun可访问A任意类实例中的私有和保护成员 (2)一般模板友元关系 template<class type> class A{