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)
只需在类中定义友元函数即可.
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)
或者,使用前向原型预先声明模板函数:
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)