C++ 使用友元运算符时出现编译器错误<&书信电报;

C++ 使用友元运算符时出现编译器错误<&书信电报;,c++,compiler-errors,operators,operator-overloading,C++,Compiler Errors,Operators,Operator Overloading,我试图使用操作符您的friend声明位于名称空间内,但函数的定义不在名称空间内。因此,它们不匹配,并且不会激活好友权限 将定义移动到名称空间内,如 namespace long_arithm { std::ostream& operator<<(std::ostream& out, const longint& num_) { if (num_.negative()) out << '-';

我试图使用操作符您的
friend
声明位于名称空间内,但函数的定义不在名称空间内。因此,它们不匹配,并且不会激活好友权限

将定义移动到名称空间内,如

namespace long_arithm
{
    std::ostream& operator<<(std::ostream& out, const longint& num_)
    {
        if (num_.negative())
            out << '-';
        longint::const_iterator it = num_.array.end();
        --it;
        longint::const_iterator finish = num_.array.begin();
        --finish;
        while (it != finish) {
            out << num_.digtochar(*it);
            --it;
        }
        return out;
    }
}
名称空间长算法
{

std::ostream&operator您的
friend
声明位于命名空间内,但函数的定义不在命名空间内。因此它们不匹配,并且不会激活friend特权

将定义移动到名称空间内,如

namespace long_arithm
{
    std::ostream& operator<<(std::ostream& out, const longint& num_)
    {
        if (num_.negative())
            out << '-';
        longint::const_iterator it = num_.array.end();
        --it;
        longint::const_iterator finish = num_.array.begin();
        --finish;
        while (it != finish) {
            out << num_.digtochar(*it);
            --it;
        }
        return out;
    }
}
名称空间长算法
{

std::ostream&operatorIt应该可以工作。发布复制问题的最小代码。应该从函数返回
out
。不能减少begin()类似的迭代器。使用
reverse\u迭代器
rbegin
/
rend
代替。它应该可以工作。发布复制问题的最小代码。您应该从函数中返回
out
。您不能减少begin()类似的迭代器。使用
反向迭代器
rbegin
/
rend
../long_arithm.h:57:20: error: «std::list<signed char> long_arithm::longint::array» is private
../long_arithm.cpp:94:36: error: in this context
../long_arithm.h:57:20: error: «std::list<signed char> long_arithm::longint::array» is private
../long_arithm.cpp:96:40: error: in this context
../long_arithm.h:44:9: error: «long_arithm::schar long_arithm::longint::digtochar(long_arithm::schar) const» is protected
../long_arithm.cpp:99:28: error: in this context
// long_arithm.h
#ifndef LONG_ARITHM_H_
#define LONG_ARITHM_H_

#include <iostream>
#include <list>

namespace long_arithm {

    typedef signed char schar;

    class longint {
    public:
        typedef std::list<schar>::const_iterator const_iterator;

        inline bool negative() const { return minusSign; }

        friend std::ostream& operator<<(std::ostream& out, const longint& num);

        enum { error_char = 127 };

    protected:
        schar digtochar(schar num) const;

    private:
        bool minusSign;
        std::list<schar> array;
    };
};

// long_arithm.cpp
#include "long_arithm.h"
#include <iostream>

using namespace long_arithm;

schar longint::digtochar(schar num) const {
    switch (num) {
        case 0: return '0';
        case 1: return '1';
        case 2: return '2';
        case 3: return '3';
        case 4: return '4';
        case 5: return '5';
        case 6: return '6';
        case 7: return '7';
        case 8: return '8';
        case 9: return '9';
        default: return error_char;
    }
}

std::ostream& operator<<(std::ostream& out, const longint& num_) {
    if (num_.negative())
        out << '-';
    longint::const_iterator it = num_.array.end();
    --it;
    longint::const_iterator finish = num_.array.begin();
    --finish;
    while (it != finish) {
        out << num_.digtochar(*it);
        --it;
    }
    return out;
}
namespace long_arithm
{
    std::ostream& operator<<(std::ostream& out, const longint& num_)
    {
        if (num_.negative())
            out << '-';
        longint::const_iterator it = num_.array.end();
        --it;
        longint::const_iterator finish = num_.array.begin();
        --finish;
        while (it != finish) {
            out << num_.digtochar(*it);
            --it;
        }
        return out;
    }
}