首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板和重载istream

模板和重载istream
EN

Stack Overflow用户
提问于 2014-01-29 16:14:23
回答 2查看 1.5K关注 0票数 1

我不知道在尝试重载>>和<<时出了什么问题

代码语言:javascript
复制
template<class T, int N> class vector{
    friend istream &operator>> <T,N>(istream &, vector &);
    friend ostream &operator<< <T,N>(ostream &, const vector &);
};

template<class T, int N>
istream &operator>>(istream &input, vector<T,N>& v)
{
    for (int i=0; i<N; i++)
        input >> v.component[i];
    return input;
}

g++编译器说

代码语言:javascript
复制
vector.h:22:17: error: template-id ‘operator>><double, 2>’ for 
‘std::istream& operator>>(std::istream&, vector<double, 2>&)’ 
does not match any template declaration
friend istream &operator>> <T,N>(istream &, vector &);
             ^
vector.h:23:17: error: template-id ‘operator<< <double, 2>’ for
‘std::ostream& operator<<(std::ostream&, const vector<double, 2>&)’
does not match any template declaration
friend ostream &operator<< <T,N>(ostream &, const vector &);
             ^
EN

回答 2

Stack Overflow用户

发布于 2014-01-29 16:19:11

您需要在模板成为好友之前声明模板(即friend子句不能像对函数那样声明模板)。

代码语言:javascript
复制
template<class T, int N> class vector;
template<class T, int N>
istream &operator>>(istream &input, vector<T,N>& v);
template<class T, int N>
ostream &operator<<(ostream &input, vector<T,N> const& v);

template<class T, int N> class vector{
    friend istream &operator>> <T,N>(istream &, vector &);
    friend ostream &operator<< <T,N>(ostream &, const vector &);
};

template<class T, int N>
istream &operator>>(istream &input, vector<T,N>& v)
{
    for (int i=0; i<N; i++)
        input >> v.component[i];
    return input;
}
票数 1
EN

Stack Overflow用户

发布于 2014-01-29 21:22:04

您编写重载的方式表明了函数模板专门化。因此出现了错误,因为没有先前声明的主模板。如果这是主定义(它确实是),那么您只需要来自封闭类声明的模板参数,因为当您使用类名作为参数时,它们会受到影响:

代码语言:javascript
复制
template<class T, int N> class vector {
    friend istream &operator>> (istream &, vector &);
    friend ostream &operator<< (ostream &, const vector &);
};

这只对函数的类内声明是特殊的。您还可以接受不同类型和值的模板参数:

代码语言:javascript
复制
template<class T, int N> class vector {
    template<class T2, int N2>
    friend istream &operator>> (istream &, vector<T2, N2> &);

    template<class T2, int N2>
    friend ostream &operator<< (ostream &, const vector<T2, N2> &);
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21425487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档