C++模板/ ostream运算符问题

Jaa*_*nus 6 c++ ostream operator-keyword

试图让操作员工作,但给我一堆错误:

我的头文件

template <unsigned short n>
class Vector {
public:
    std::vector<float> coords;

    Vector();
    Vector(std::vector<float> crds);
    friend std::ostream& operator <<(std::ostream& out, const Vector& v);
};

template <unsigned short n>
Vector<n>::Vector() {
coords.assign(n, 0.0);
}

template <unsigned short n>
std::ostream& operator<<(std::ostream& out, const Vector<n>& v) {
out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
return out;
}
Run Code Online (Sandbox Code Playgroud)

测试文件

#include <iostream>
#include "vector.h"
using namespace std;

int main() {
Vector<3> toomas;
cout << toomas;

}
Run Code Online (Sandbox Code Playgroud)

错误:

C:\ CodeBlocks\kool\praks3\vector.h | 14 |警告:朋友声明'std :: ostream&operator <<(std :: ostream&,const Vector&)'声明一个非模板函数

C:\ CodeBlocks\kool\praks3\vector.h | 14 |注意:(如果这不是你想要的,请确保已经声明了函数模板并在函数名后添加<>)

obj\Debug\test.o ||在函数`main'中:|

C:\ CodeBlocks\kool\praks3\test.cpp | 8 |未定义引用`operator <<(std :: ostream&,Vector <(unsigned short)3> const&)'|

Naw*_*waz 11

它说,请查看错误,

friend声明'std :: ostream&operator <<(std :: ostream&,const Vector&)'声明一个非模板 函数

这意味着您需要创建operator<<模板功能.

所以在课堂上,你要把它声明为:

template<unsigned short m> //<----note this: i.e make it template!
friend std::ostream& operator <<(std::ostream& out, const Vector<m>& v);
Run Code Online (Sandbox Code Playgroud)

然后将其定义为,

template <unsigned short m>
std::ostream& operator<<(std::ostream& out, const Vector<m>& v) {
   out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
   return out;
}
Run Code Online (Sandbox Code Playgroud)

  • 呸.为什么`vector <<"for`vector <m>`可以访问`Vector <n>`的私有? (2认同)

Ben*_*igt 6

只需在类中定义友元函数即可.

template <unsigned short n>
class Vector
{
public:
    std::vector<float> coords;

    Vector();
    Vector(std::vector<float> crds);
    friend std::ostream& operator <<(std::ostream& out, const Vector& v)
    {
        out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
        return out;
    }
};

template <unsigned short n>
Vector<n>::Vector()
{
    coords.assign(n, 0.0);
}


int main()
{
    Vector<3> toomas;
    cout << toomas;
}
Run Code Online (Sandbox Code Playgroud)

测试:http://ideone.com/LDAR4

或者,使用前向原型预先声明模板函数:

template <unsigned short n>
class Vector;

template <unsigned short n>
std::ostream& operator <<(std::ostream& out, const Vector<n>& v);

template <unsigned short n>
class Vector
{
public:
    std::vector<float> coords;

    Vector();
    Vector(std::vector<float> crds);
    friend std::ostream& operator << <>(std::ostream& out, const Vector& v);
};

template <unsigned short n>
Vector<n>::Vector()
{
    coords.assign(n, 0.0);
}

template <unsigned short n>
std::ostream& operator <<(std::ostream& out, const Vector<n>& v)
{
    out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
    return out;
}
Run Code Online (Sandbox Code Playgroud)

测试:http://ideone.com/8eTeq