c++ - 在先前定义的模板类中专门化 friend 运算符错误

标签 c++ templates operator-keyword friend

我试图在我的模板类中专门针对 char 的 << 运算符

生命周期

template<class T>
class tablicowy{
public:
    T * tablica;
    int rozmiar;
public:
    tablicowy(T arr[], int n){
        {
            tablica = arr;
            rozmiar = n;
        }
    };
    friend std::ostream& operator<<(std::ostream& out, tablicowy<char>& that );
    friend std::ostream& operator<<(std::ostream& out, tablicowy<T>& that ){
        out << "( ";
        for(int i = 0; i < that.rozmiar; i++){
            out << that.tablica[i] << comma;
        }
        out << ")";
        return out;
    };

};

cpp

std::ostream& operator<<(std::ostream& out, tablicowy<char>& that ){
    out << "'";
    for(int i = 0; i < that.rozmiar; i++){
        out << that.tablica[i];
    }
    out << "'";
    return out;
};

C++ 给我:

In file included from /home/pawel/ClionProjects/lista9/obliczenia.cpp:1:0: /home/pawel/ClionProjects/lista9/obliczenia.hpp: In instantiation of ‘class obliczenia::tablicowy’: /home/pawel/ClionProjects/lista9/obliczenia.cpp:38:28: required from here /home/pawel/ClionProjects/lista9/obliczenia.hpp:40:30: error: redefinition of ‘std::ostream& obliczenia::operator<<(std::ostream&, obliczenia::tablicowy&)’ friend std::ostream& operator<<(std::ostream& out, tablicowy& that ){ ^ /home/pawel/ClionProjects/lista9/obliczenia.cpp:36:15: error: ‘std::ostream& obliczenia::operator<<(std::ostream&, obliczenia::tablicowy&)’ previously defined here std::ostream& operator<<(std::ostream& out, tablicowy& that ){

我可以做些什么来为 char 重载或专门化该运算符?

最佳答案

您可以使用以下内容:

// Forward declare the class
template <typename T> class tablicowy;

// Forward declare the template operator
template <typename T>
std::ostream& operator<<(std::ostream& out, tablicowy<T>& that );

// Forward declare the function
std::ostream& operator<<(std::ostream& out, tablicowy<char>& that );

// Your class:
template<class T>
class tablicowy{
public:
    T * tablica;
    int rozmiar;
public:
    tablicowy(T arr[], int n){
        {
            tablica = arr;
            rozmiar = n;
        }
    };
    // just declare them friend.
    friend std::ostream& operator<<(std::ostream& out, tablicowy<char>& that );
    friend std::ostream& operator<< <>(std::ostream& out, tablicowy<T>& that );

};

// Implementation
template <typename T>
std::ostream& operator<<(std::ostream& out, tablicowy<T>& that )
{
    const std::string comma = ",";
    out << "( ";
    for(int i = 0; i < that.rozmiar; i++){
        out << that.tablica[i] << comma;
    }
    out << ")";
    return out;
}

在 cpp 中:

std::ostream& operator<<(std::ostream& out, tablicowy<char>& that ){
    out << "'";
    for(int i = 0; i < that.rozmiar; i++){
        out << that.tablica[i];
    }
    out << "'";
    return out;
}

[ https://ideone.com/SXClzp](Live示例)

关于c++ - 在先前定义的模板类中专门化 friend 运算符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30192508/

相关文章:

c++ - 在不知道缓冲区大小的情况下从套接字读取

c++ - 使用包含 3001 位数字的非常大的整数

c++ - 如何将一个整数与另外两个整数分开? C/C++

javascript - 我无法输出 Handlebars 模板中的数据

function - Haskell 中的运算符和函数优先级

c++ - 在我的递归函数中跟踪计数 (Collat​​z)

C++单例模板类继承

c++ - 仅在具有零参数模板的头文件中定义 C++ 全局函数?

c++ - C++ 中不等式 != 的运算符交换性

c++ - 不同类如何操作一个函数一个