оператор перегрузки << для производного класса говорит недопустимые операнды - PullRequest
0 голосов
/ 27 февраля 2019
class A {
    //does stuff

public:
    virtual std::ostream& operator<< (std::ostream& os) = 0;
};

class B : public A {
public:
    //does similiar stuff

    virtual std::ostream& operator<< (std::ostream& os) {
        os << "x" << std::endl;
    }
}

class C {
public:
    A* array[10];

    A* & operator()(int a) {
        // in my code, it is a 2D array indexed with (),
        // but that's irrelevant here
        return array[a];
    }
}

int main(){
    C c = C();

    //in for loop we say c(i) = new B();
    for(int i=0; i<10; i++){
        std::cout << *(c(i)); // error
    }

    return 0;
}

Я предполагаю, что проблема в том, что оператор my () возвращает базовый указатель вместо указателя B, а A не имеет <<.Но использование шаблонов для индексации также не решает проблему, а только делает ее более странной. </p>

Есть идеи?

1 Ответ

0 голосов
/ 27 февраля 2019

Проблема в том, что вы перегружаете operator<< как функцию member .Это означает, что он может использоваться только как, например,

instance_of_B << std::cout;

, что переводится в

instance_of_B.operator<<(std::cout);

Если вы хотите перегрузить << как оператор вывода потока, это должен быть не -член-функция, и принять поток в качестве первого аргумента и A (или производный) объект в качестве второго аргумента.

Чтобы обработать вывод, вы можете использовать виртуальныйФункция-член, которая делает это и которая вызывается функцией, не являющейся членом operator<<.

Возможно, что-то вроде

class A
{
public:
    ...

    // Inline definitions of friend functions makes the functions non-member functions
    friend std::ostream& operator<<(std::ostream& os, A const& a)
    {
        return a.output(os);
    }

protected:
    virtual std::ostream& output(std::ostream&) = 0;
};

class B
{
    ...

protected:
    std::ostream& output(std::ostream& os) override
    {
        return os << "Output from the B class\n";
    }
};
...