上一篇:http://www.BkJia.com/kf/201112/115030.html
16.4.2 非類型形參的模板實參
//Template1.h
#include <string>
using namespace std;
#ifndef TEMPLATE1_H
#define TEMPLATE1_H
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
};
#include "Template1.cpp"
#endif
//Template1.h
#include <string>
using namespace std;
#ifndef TEMPLATE1_H
#define TEMPLATE1_H
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
};
#include "Template1.cpp"
#endif//CP.cpp
Screen<100,200> hp;
//CP.cpp
Screen<100,200> hp;非類型模板實參必須是編譯時常量表達式。
16.4.3 類模板中的友元聲明
在類模板中可以出現三種友元聲明:
(1)普通非模板類或函數的友元聲明,將友元關系授予明確指定的類或函數。
(2)類模板或函數模板的友元聲明,授予對友元所有實例的訪問權。
(3)只授予對類模板或函數模板的特定實例的訪問權的友元聲明。
1. 普通友元
非模板類或非模板函數可以是類模板的友元。
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
friend class Base;
};
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
friend class Base;
};
2. 一般模板友元關系
#include <string>
#include "Class.h"
#include "Queue.h"
using namespace std;
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
template<class Type> friend class Queue;
};
#include <string>
#include "Class.h"
#include "Queue.h"
using namespace std;
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
template<class Type> friend class Queue;
};友元可以是類模板或函數模板。
3. 特定的模板友元關系
除了將一個模板的所有實例設為友元,類也可以只授予對特定實例的訪問權。
#include <string>
#include "Class.h"
#include "Queue.h"
using namespace std;
template <int hi, int wid, class Type>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
friend class Queue<Type>;
};
#include <string>
#include "Class.h"
#include "Queue.h"
using namespace std;
template <int hi, int wid, class Type>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
friend class Queue<Type>;
};4. 聲明依賴性
當授予對給定模板的所有實例的訪問權的時候,在作用域中不需要存在該類模板或函數模板的聲明。實際上,編譯器將友元聲明也當作類或函數的聲明對待。
想要限定對特定實例化的友元關系時,必須在可以用於友元聲明之前聲明類或函數。
#include <string>
#include "Class.h"
using namespace std;
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
template<class Type> friend class Queue;
};
#include <string>
#include "Class.h"
using namespace std;
template <int hi, int wid>
class Screen{
public:
Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
template<class Type> friend class Queue;
};
摘自 xufei96的專欄