模板类的朋友功能:C
friend function for template class : C++
我写了一个代码:
#include <iostream>
#include <cassert>
using namespace std;
template<typename T>
class dynArray{
int size;
T* ptr;
public:
dynArray(int n=0);
~dynArray();
T& operator[] (const int index);
friend ostream& operator<<<T>(ostream& os,const dynArray<T>& A);
};
template<typename T> dynArray<T>::dynArray(int n):size(n){
if (size==0)
{
cout << "Size Zero"<< endl;
ptr=NULL;}
else
{
try{
ptr = new T[size];
cout << "Constructor Called" << endl;
}
catch(bad_alloc xa)
{
cout << "Allocation Failure" <<endl;
exit(EXIT_FAILURE);
}
}
}
template<typename T> dynArray<T>::~dynArray(){
cout << "Destructor Called for array of size : " << size << endl;
delete[] ptr;
}
template<typename T> T& dynArray<T>::operator[] (const int index){
assert(index >=0 && index <size);
return *(ptr+index);
}
template<typename T> ostream& operator<< <T>(ostream& os,const dynArray<T>& A){
for (int i=0; i < A.size ; i++)
os << *(A.ptr+i) << " ";
return os;
}
int main()
{
dynArray<int> array1;
dynArray<int> array2(5);
array2[0]=15;
array2[3]= 45;
cout << array2 << endl;
return 0;
}
但是在编译错误时:
$ g++ -Wall DynArray.cpp -o DynArray
DynArray.cpp:46: error: partial specialization `operator<< <T>' of function template
DynArray.cpp: In instantiation of `dynArray<int>':
DynArray.cpp:54: instantiated from here
DynArray.cpp:14: error: template-id `operator<< <int>' for `std::basic_ostream<char, std::char_traits<char> >& operator<<(std::basic_ostream<char, std::char_traits<char> >&, const dynArray<int>&)' does not match any template declaration
DynArray.cpp: In function `std::ostream& operator<<(std::ostream&, const dynArray<T>&) [with T = int]':
DynArray.cpp:61: instantiated from here
DynArray.cpp:8: error: `int dynArray<int>::size' is private
DynArray.cpp:47: error: within this context
DynArray.cpp:9: error: `int*dynArray<int>::ptr' is private
DynArray.cpp:48: error: within this context
我认为我的模板语法对于operator<<
是错误的。有人可以帮忙吗?无法弄清楚错误在哪里。
您无法friend
未宣布的模板功能的专业化。您需要事先声明operator <<
。当然,要这样做,您需要已经有dynArray
的声明。这种前瞻性声明看起来像这样(现场在Coliru):
template<typename T> class dynArray;
template<typename T>
ostream& operator << (ostream& os, const dynArray<T>& A);
template<typename T>
class dynArray {
// ...
friend ostream& operator<< <T>(ostream& os, const dynArray& A);
};
正如@ooga在他的评论中指出的那样,朋友声明中的模板参数是不必要的。编译器可以推断出它们。您可以简单地将其声明为:
friend ostream& operator<< <> (ostream& os, const dynArray& A);
我个人发现这种语法在这种情况下有点像标点符号。
另外,如果您发现前向声明令人反感,则可以通过在类定义中定义dynArray
的每个专业化来声明单独的非序列朋友函数(再次COLIRU):
template<typename T>
class dynArray {
// ...
friend ostream& operator<< (ostream& os,const dynArray& A) {
for (int i=0; i < A.size ; i++)
os << *(A.ptr+i) << " ";
return os;
}
};
在类中,将朋友声明为: -
template<typename U>
friend ostream& operator<<(ostream& os,const dynArray<U>& A);
并将其定义为: -
template<typename U>
ostream& operator<< (ostream& os,const dynArray<U>& A){...}
请参阅此处
相关文章:
- 类似虚拟的朋友功能?
- 有没有办法C++将给定类的功能限制为仅另一个类(不使用继承,朋友)?
- 如何让CPP核心功能成为我班的朋友
- C 朋友课程和朋友成员功能
- C 交叉相关单例.在没有朋友的情况下,我如何使用彼此的功能
- 朋友功能声明中的错误C
- 朋友功能不起作用(语法错误)
- Forward宣布了Singleton班级,并带有Freshial声明的朋友功能
- 如何朋友模板类功能
- 我的朋友功能无法访问私人变量
- 我正在尝试使用朋友功能,但我无法访问第二类的私人数据成员
- 朋友功能可访问性问题
- 防止朋友功能访问班级的私人会员
- 朋友功能声明为会员函数
- C 朋友模板功能错误
- 朋友功能无法访问私有成员变量
- 朋友功能是否继承?为什么基类朋友功能在派生的类对象上工作
- 使用模板独立enable_if时,链接器错误带有模板的朋友功能
- 朋友在课堂和外班上的功能,它有什么区别
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符