【问题标题】:Why I am getting link error on declared function? [duplicate]为什么我在声明的函数上出现链接错误? [复制]
【发布时间】:2018-09-15 09:31:39
【问题描述】:

考虑这个类的例子。简化版。

#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

谁能解释为什么?我想我已经实现了这个功能。

【问题讨论】:

标签: c++ templates friend


【解决方案1】:

类定义中的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;
}

【讨论】:

  • 后面的代码不行?你测试过吗?
  • @Shadi 是默认模板参数重定义问题吗?固定。
猜你喜欢
  • 2011-10-31
  • 2023-03-08
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多