首页 > 解决方案 > 在模板类中重载 istream>> 和 ostream<<

问题描述

我想在模板类中重载 >> 和 << 并且我遇到了一些错误。

Severity    Code    Description Project File    Line    Suppression State
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 MatricePatratica<int> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$MatricePatratica@H@@@Z) referenced in function _main   ConsoleApplication3 C:\Users\Octavian\source\repos\ConsoleApplication3\ConsoleApplication3\Source.obj   1   
Error   LNK2019 unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class MatricePatratica<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$MatricePatratica@H@@@Z) referenced in function _main ConsoleApplication3 C:\Users\Octavian\source\repos\ConsoleApplication3\ConsoleApplication3\Source.obj   1   
Error   LNK1120 2 unresolved externals  ConsoleApplication3 C:\Users\Octavian\source\repos\ConsoleApplication3\Debug\ConsoleApplication3.exe    1   

AFAIK 当一个函数被声明但未实现时会发生这种情况。我收到那些重载错误>> <<(如您在上面看到的)

唯一的事情是我实现了这些功能,所以我希望它能够工作。但我可能会遗漏一些东西。

这是我的模板类

#pragma once

template <typename T>
class MatricePatratica
{
private:
    T** date;
    int n = 0;
public:
    MatricePatratica();
    MatricePatratica(int);
    MatricePatratica(const MatricePatratica&);

    friend std::istream& operator>>(std::istream& is, MatricePatratica<T>& obj);
    friend std::ostream& operator<<(std::ostream& os, const MatricePatratica<T>& obj);
};

template<typename T>
inline MatricePatratica<T>::MatricePatratica()
{
}

template<typename T>
inline MatricePatratica<T>::MatricePatratica(int n) :n(n)
{
    date = new int* [n];
    for (int i = 0; i < n; i++)
    {
        date[i] = new int[n];
    }
}

template<typename T>
inline MatricePatratica<T>::MatricePatratica(const MatricePatratica& deCopiat)
{
    date = new int* [deCopiat->n];
    for (int i = 0; i < deCopiat->n; i++)
    {
        date[i] = new int[deCopiat->n];
    }
    for (int i = 0; i < deCopiat->n; i++)
    {
        for (int j = 0; j < deCopiat->n; j++)
        {
            date[i][j] = deCopiat[i][j];
        }
    }
}

template <typename T>
std::istream& operator>>(std::istream& is, MatricePatratica<T>& obj)
{
    for (int i = 0; i < obj.n; i++)
    {
        for (int j = 0; j < obj.n; j++)
        {
            is >> obj.date[i][j];
        }
    }
    return is;
}

template <typename T>
std::ostream& operator<<(std::ostream& os, const MatricePatratica<T>& obj)
{
    for (int i = 0; i < obj.n; i++)
    {
        for (int j = 0; j < obj.n; j++)
        {
            os << obj[i][j] << " ";
        }
        os << std::endl;
    }
    return os;
}

这是主文件:

#include <iostream>
#include "MatricePatratica.h"

int main()
{
    MatricePatratica<int> test(5);
    std::cin >> test;
    std::cout << test;
}

为什么我会收到此错误,我应该如何解决?

现场演示

标签: c++

解决方案


问题是你已经声明了一个不是模板的东西的友谊!

所以编译器试图找到:

std::istream& operator>>(std::istream& is, MatricePatratica<int>& obj)

哪个不存在,实际上它应该使用:

// note extra template parameter:
std::istream& operator>><int>(std::istream& is, MatricePatratica<int>& obj)

要修复它,您需要向这些运算符的模板声明友谊:

template <typename T>
class MatricePatratica
{
....
    template<typename U>
    friend std::istream& operator>>(std::istream& is, MatricePatratica<U>& obj);
    
    template<typename U>
    friend std::ostream& operator<<(std::ostream& os, const MatricePatratica<U>& obj);
};

修复错字后,它可以工作:https ://wandbox.org/permlink/gHEmap8zCCTyBjRA


推荐阅读