Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在模板类中使用友元运算符?_C++_Templates_Operator Keyword - Fatal编程技术网

C++ 如何在模板类中使用友元运算符?

C++ 如何在模板类中使用友元运算符?,c++,templates,operator-keyword,C++,Templates,Operator Keyword,我有一个模板类,它有一些朋友操作符。编译器抱怨“友元声明声明声明了一个非模板函数”。不幸的是,我不知道如何解决这个错误。有什么提示吗 代码如下所示: template<typename X> class Vect { protected: X v1_; X v2_; X v3_; public: Vect( X v1, X v2, X v3 ); Vect( const Vect<X> &v); ~Vect();

我有一个模板类,它有一些朋友操作符。编译器抱怨“友元声明声明声明了一个非模板函数”。不幸的是,我不知道如何解决这个错误。有什么提示吗

代码如下所示:

template<typename X> class Vect
{

protected:
    X v1_;
    X v2_;
    X v3_;

public:
    Vect( X v1, X v2, X v3 );
    Vect( const Vect<X> &v);
    ~Vect();
    void printVect( );
    friend ostream& operator<<(ostream& os, const Vect<X>& v);
    friend const Vect<X> operator*(Vect<X>& v, X n);
    friend const Vect<X> operator*(X n, Vect<X>& v);


};


template<typename X> Vect<X>::Vect( X v1, X v2, X v3 )
    : v1_(v1),v2_(v2), v3_(v3)  
{
//  v1_ = v1;
//  v2_ = v2;
//  v3_ = v3;  
}

template<typename X> Vect<X>::Vect( const Vect<X> &v )
    : v1_(v.v1_), v2_(v.v2_), v3_(v.v3_)
{
}

template<typename X> Vect<X>::~Vect( )
{
} 

template<typename X> void Vect<X>::printVect( )
{
    cout << "(" << v1_ << ", " << v2_ << ", " << v3_ << ")" << endl; 
}

template<typename X> ostream& operator<<(ostream& os, const Vect<X>& v)
{
    os << "(" << v.v1_ << ", " << v.v2_ << ", " << v.v3_ << ")" << endl;
    return os;
}

template<typename X> const Vect<X> operator*(Vect<X>& v, X n)
{
    Vect<X> tmp(v);
    tmp.v1_ *= n;
    tmp.v2_ *= n;
    tmp.v3_ *= n;
    return tmp;
}

template<typename X> const Vect<X> operator*(X n, Vect<X>& v)
{
    return v*n;
}
模板类向量
{
受保护的:
X v1_u2;;
xv2;
xv3;
公众:
向量(xv1,xv2,xv3);
向量(const-Vect&v);
~Vect();
void printVect();

friend ostream&operator您需要原型的模板参数:

template <typename T>
friend ostream& operator<<(ostream& os, const Vect<T>& v);
模板

friend ostream&Operator您也可以在这里查找。您的建议让我更进一步!谢谢!现在,编译器抱怨访问运算符中受保护的成员变量v1、v2和v3(@Jonas我想你需要对
操作符*
使用相同的解决方案。是的,友元函数可以访问受保护的类成员。将类内的声明更改为
模板友元ostream&operator
,这是稍后定义的。我已经将模板参数添加到两个原型中。不过,编译器现在抱怨在两个操作符中访问受保护的成员变量(正如我在前面的评论中所说的那样。这适用于你们,Jonas和Hex guy:P