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

标签 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();
    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;
}

提前谢谢

乔纳斯

最佳答案

您需要原型(prototype)的模板参数:

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

关于c++ - 如何在模板类中使用友元运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19753609/

相关文章:

javascript - knockout : callback function when the content of a template changes

c++ - 在编译时获取函数名称?

c++ - 使用采用模板化迭代器的自由函数重载 operator==

c++ - Ubuntu 上的 g++ 4.8.1 无法编译大型位集

c++ - 如何在gcc 8上使用std::filesystem?

c++ - Qt/QML : How to activate a Shortcut from C++?

c++ - 我如何创建一个将模板对象与其自己的模板列表相关联的方法?

c++ - + 运算符,类类型和内置类型之间的区别?

PHP 字符串数字连接搞砸了

c++ - 如何释放包含 std::vector 的对象的内存