程式一:
#include<iostream>
using std::cout;
using std::endl;
template<class T>void show2(T & hf){std::cout<<hf.a;}
template<class T>
class A
{
private:
int a;
public:
friend void show2<T>(A<T> &);
};
template class A<double>;
int main(void)
{
return 0;
}
結果:報錯

程式二:
#include<iostream>
using std::cout;
using std::endl;
template<class T>void show2(T & hf){std::cout<<hf.a;}
template<class T>
class A
{
private:
int a;
public:
friend void show2<T>(A<T> &);
};
//template class A<double>;
int main(void)
{
return 0;
}
結果:不報錯
這兩個程式的區別是:有顯式實體化則報錯,否則就不報錯。這是什么道理呢?
uj5u.com熱心網友回復:
你的顯式實體化語法錯了吧?uj5u.com熱心網友回復:
兩個都是錯誤的,第二個不報錯是因為你還沒實體化模板類的友元是這樣宣告
#include<iostream>
#include<cstring>
using namespace std;
template<class T>
class A
{
private:
int a;
public:
A(){}
template<typename C>
friend void show2(A<C>&);
};
template<typename T>
void show2(A<T>& hf)
{
std::cout << hf.a;
}
template<>
class A<double>{
double a;
public:
A() { a = 0; }
template<typename T>
friend void show2(A<T>&);
};
int main(void)
{
A<double> a1;
show2(a1);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/269804.html
標籤:C++ 語言
