为什么我在声明的函数上遇到链接错误?

时间:2018-04-05 14:06:33

标签: c++ templates friend

考虑这个类示例。简化版。

#include <iostream>
#include <vector>
#include <iomanip>

using std::setw;
using std::ostream;
using std::istream;

template<class T=int, int size=10>
class Array
{
     friend istream& operator>>(istream&, Array<T,size>&);
public:
private:
     T arr[size];
};

template<class T, int size>
istream& operator>>(istream& input, Array<T,size> &a)
{
     for(int i=0; i<size;++i)
     {
          input>>a.arr[i];
     }
     return input;
}

int main()
{
     Array<int> x;
     std::cin>>x;
}

我得到了:

1>main.obj : error LNK2019: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class Array<int,10> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Array@H$09@@@Z) referenced in function _main

任何人都可以解释原因吗?我想我已经实现了这个功能。

1 个答案:

答案 0 :(得分:3)

类定义中的friend声明声明了一个非模板函数,然后你定义了一个模板函数,它们不匹配。非模板函数在重载分辨率中被提供,但它没有定义,因此您得到了链接错误。

您可以在类定义中定义它,

template<class T=int, int size=10>
class Array
{
     friend istream& operator>>(istream&, Array<T,size>&)
     {
         for(int i=0; i<size;++i)
         {
             input>>a.arr[i];
         }
         return input;
     }
public:
private:
     T arr[size];
};

或者让朋友声明参考模板功能。

template<class T=int, int size=10>
class Array;

template<class T, int size>
istream& operator>>(istream& input, Array<T,size> &a);

template<class T, int size>
class Array
{
     friend istream& operator>> <>(istream&, Array<T,size>&);
public:
private:
     T arr[size];
};

template<class T, int size>
istream& operator>>(istream& input, Array<T,size> &a)
{
     for(int i=0; i<size;++i)
     {
          input>>a.arr[i];
     }
     return input;
}