C++ 模板类的友元函数:C++;

C++ 模板类的友元函数:C++;,c++,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);

我编写了一个代码:

#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;
}
#包括
#包括
使用名称空间std;
模板
类dynArray{
整数大小;
T*ptr;
公众:
dynArray(int n=0);
~dynArray();
T&运算符[](常数整数索引);

类中的friend ostream和运算符将friend声明为:-

template<typename U>
friend ostream& operator<<(ostream& os,const dynArray<U>& A);
模板

friend ostream&operator您不能
friend
一个未声明的模板函数的特化。您需要声明
操作符!但是您可能不应该在
friend
声明中声明
。只是
更为常见。@ooga我认为它不会与
t
混淆在我的经验中,任何一种没有模板的
关键字的
都足以让人困惑-
T
或no
T
。我希望多说一点会有帮助。我认为那里不允许有T。也许使用不同的字母会更好?不过,很好的解释。这不是“a”代码,它只是代码,或者一些代码,或者就像我们人类说的,“一个程序”。-)
template<typename U>
friend ostream& operator<<(ostream& os,const dynArray<U>& A);
template<typename U> 
ostream& operator<< (ostream& os,const dynArray<U>& A){...}
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);
    };
friend ostream& operator<< <> (ostream& os, const dynArray& A);
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;
    }
};