我有一个通用类Array1d,其朋友函数声明为

friend std::ostream& operator<< <>(std ::ostream& out, Array1D<T>& a);


并定义为

template<typename U>
std::ostream& operator<< (std ::ostream& out, Array1D<U> a){
    for(int i=0;i<a.size;i++){
        out<<a[i]<<" ";
    }
    out<<endl;
    return out;
}


但是如果我尝试

Array1D<int> a;
cout<<a;


我得到这个错误

(1).cpp|62|error: template-id 'operator<< <>' for 'std::ostream& operator<<(std::ostream&, Array1D<int>&)' does not match any template declaration|


我已经尝试为int显式地实例化它,

std::ostream& operator<< (std ::ostream& out, Array1D<int> a){
    for(int i=0;i<a.size;i++){
        out<<a[i]<<" ";
    }
    out<<endl;
    return out;
}


但是它给出了相同的错误。帮助表示赞赏。

最佳答案

friend std::ostream& operator<< <>(std ::ostream& out, Array1D<T>& a);
template<typename U>std::ostream& operator<< (std ::ostream& out, Array1D<U> a)


这两个功能不相同。这是因为Array1D<T>是具体类型。如果希望1.匹配2.,则需要将其设为模板,可能将其设为Array1D<U>。如果您过分谨慎,还可以检查T = U。

10-07 20:22