使用函数模板重载输出运算符报错
1,报错提示
1>main.obj : error LNK2019: 无法解析的外部符号 “class std::basic_ostream<char,struct std::char_traits > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits > &,class Vector const &)” (??6@YAAAV? b a s i c o s t r e a m @ D U ? basic_ostream@DU? basicostream@DU?char_traits@D@std@@@std@@AAV01@ABV?$Vector@H@@@Z),函数 _main 中引用了该符号 |
---|
fatal error LNK1120: 1 个无法解析的外部命令 |
2,原代码
friend ostream& operator<<(ostream& out, const Vector<T>& object);
3,改后加上就不会报错
friend ostream& operator<< <T> (ostream& out, const Vector<T>& object);
4,输出运算符重载的具体实现不用加
template<typename T>
ostream& operator<<(ostream& os, const Vector<T>& object)
5,如果以上依然不能解决
template<typename T>
class Vector;//类名
template<typename T>
ostream& operator<<(ostream& out, const Vector<T>& object);//重载输出运算符
写在.h文件中类外即可
6,具体实现代码
1,Vector.h
#pragma once
#include<iostream>
using namespace std;
//template<typename T>
//class Vector;
//template<typename T>
//ostream& operator<<(ostream& out, const Vector<T>& object);
template<typename T>
class Vector
{
friend ostream& operator<< <T> (ostream& out, const Vector<T>& object);
public:
Vector(int size = 128);
~Vector();
Vector(const Vector& object);
int getLenth();
T& operator[](int index);
Vector& operator=(Vector& object);
private:
T* m_base;
int m_len;
};
2,Vector.hpp
#include<iostream>
#include "Vector.h"
using namespace std;
template<typename T>
ostream& operator<<(ostream& os, const Vector<T>& object)
{
for (int i = 0; i < object.m_len; i++) {
os << object.m_base[i] << " ";
}
os << endl;
return os;
}
template<typename T>
Vector<T>::Vector(int size)
{
if (size > 0) {
m_len = size;
m_base = new T[m_len];
}
}
template<typename T>
Vector<T>::~Vector()
{
if (m_base != NULL) {
delete m_base;
m_base = NULL;
m_len = 0;
}
}
template<typename T>
Vector<T>::Vector(const Vector& object)
{
m_len = object.m_len;
m_base = new T[m_len];
for (int i = 0; i < m_len; i++) {
m_base[i] = object.m_base[i];
}
}
template<typename T>
int Vector<T>::getLenth()
{
return m_len;
}
template<typename T>
T& Vector<T>::operator[](int index)
{
return m_base[index];
}
template<typename T>
Vector<T>& Vector<T>::operator=(Vector<T>& object)
{
if (m_base != NULL) {
delete m_base;
m_base = NULL;
m_len = 0;
}
m_len = object.m_len;
m_base = new T[m_len];
for (int i = 0; i < m_len; i++) {
m_base[i] = object.m_base[i];
}
return *this;
}
3,main函数
#include<iostream>
#include"Vector.hpp"
using namespace std;
int main() {
Vector<int> v1(10);
for (int i = 0; i < v1.getLenth(); i++) {
v1[i] = i;
}
cout << v1<<endl;
cout << "准备输出下标" << endl;
for (int i = 0; i < v1.getLenth(); i++) {
cout << v1[i] <<endl;
}
return 0;
}