Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 过载istream>&燃气轮机;和奥斯特雷姆<&书信电报;在模板类中_C++ - Fatal编程技术网

C++ 过载istream>&燃气轮机;和奥斯特雷姆<&书信电报;在模板类中

C++ 过载istream>&燃气轮机;和奥斯特雷姆<&书信电报;在模板类中,c++,C++,我想重载>>和>(std::istream&is、MatricePatratica&obj); friend std::奥斯特雷姆和运营商;(i++) { 日期[i]=新整数[deCopiat->n]; } 对于(int i=0;in;i++) { 对于(int j=0;jn;j++) { 日期[i][j]=装饰[i][j]; } } } 模板 std::istream&operator>>(std::istream&is、MatriceAtratica&obj) { for(int i=0;i

我想重载>>和>(std::istream&is、MatricePatratica&obj); friend std::奥斯特雷姆和运营商;(i++) { 日期[i]=新整数[deCopiat->n]; } 对于(int i=0;in;i++) { 对于(int j=0;jn;j++) { 日期[i][j]=装饰[i][j]; } } } 模板 std::istream&operator>>(std::istream&is、MatriceAtratica&obj) { for(int i=0;i>目标日期[i][j]; } } 回报是; } 模板
std::ostream&operator问题在于,您已经声明了与非模板的东西的友谊

所以编译器试图找到:

std::istream&operator>>(std::istream&is、MatriceAtratica&obj)
它不存在,但实际上它应该使用:

//注意额外的模板参数:
std::istream&operator>>(std::istream&is、MatriceAtratica&obj)
要修复此问题,您需要向这些运算符的模板声明友谊:

模板
矩阵类
{
....
模板
friend std::istream&operator>>(std::istream&is,MatricePatratica&obj);
模板

friend std::ostream&operator问题是您已经声明了与非模板的对象的友谊

所以编译器试图找到:

std::istream&operator>>(std::istream&is、MatriceAtratica&obj)
它不存在,但实际上它应该使用:

//注意额外的模板参数:
std::istream&operator>>(std::istream&is、MatriceAtratica&obj)
要修复此问题,您需要向这些运算符的模板声明友谊:

模板
矩阵类
{
....
模板
friend std::istream&operator>>(std::istream&is,MatricePatratica&obj);
模板

friend std::ostream&operator这里有另一种让friend函数工作的方法。代码稍微多了一点,但它的优点是将friend函数实例化与类的实例化绑定在一起


被接受的答案的问题是它太自由了。假设你有一个
MatricePatratica
。它有你的
操作符()的所有可能版本作为朋友
;正如在
操作符中一样,这里有一种让友元函数工作的替代方法。虽然有更多的代码,但它的优点是将友元函数实例化与类的实例化绑定在一起


被接受的答案的问题是它太自由了。假设你有一个
MatricePatratica
。它有你的
操作符()的所有可能版本作为朋友<代码>操作符,这可能是最自由的修复。一个潜在的问题是朋友实例化与类实例化没有关系。个人讨厌C++中的代码>朋友< /Cord>关键字。我不使用它。很容易删除它:IMO它更清楚,并且可以避免这个愚蠢的错误。我以为你是在玩。g使用一个自由函数和一些吸引子。这个链接更糟,违背了最小惊讶的原则。这可能是最自由的修复。一个潜在的问题是朋友实例化与类实例化没有关系。个人来说,我讨厌C++中的代码>朋友< /Cord>关键字。我不使用它。:在我看来,这更清楚,你可以避免这个愚蠢的错误。我以为你要使用一个免费函数和一些getter。这个链接更糟糕,违反了最小惊讶原则。
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   

#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;
}