Шаблонная функция обтекания C ++ - PullRequest
0 голосов
/ 04 марта 2011
  • У меня есть класс шаблона A и функция оператора потока для A, которая, следовательно, является функцией шаблона.
  • У меня есть класс B, который наследуется от A, указывая тип для шаблона идобавив некоторые вещи, специфичные для B.
  • Я пишу оператор потока на B, который делает что-то специфическое для B, а затем возвращается к остальным операциям потока, запрограммированным для A.

Поскольку B является подклассом A (вы называете это так?), Вызов потокового оператора A должен работать.На самом деле operator>>(f,a) в main () работает.Но по какой-то причине он не работает на b, приведенном к A. Я получаю сообщение об ошибке: «нет соответствующей функции для вызова оператора operator >> (std :: basic_istream> &, A)».

Чтоя делаю не так?

Вот пример кода:

#include <stdlib.h>
#include <fstream>
#include <iostream>

using namespace std;


template <class TypeT>
class A
{
public:
    A(){a = -9;}
    A(TypeT v){a = v;}
    TypeT a;
};

class B : public A<int>
{
public:
    B(int w) : A<int>(10) {b = w;}
    int b;
};

template <class TypeT>
istream &operator>> (istream &s, A<TypeT> &a)
{
    cout << "a.a = " << a.a << endl;
    return s;
}

istream &operator>> (istream &s, B &b)
{
    cout << "b.b = " << b.b << "  ";
    operator>>( s, (A<int>)b);    // error!
    return s;
}



int main(void) {
    ifstream f("/dev/null");

    A<int> a(0);
    operator>>( f, a );

    B b(1);
    operator>>( f, b );

    return EXIT_SUCCESS;
}

.

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Измените свой состав на:

operator>>(s, (A<int> &)b);

Ваш оригинальный состав создает временный объект, на который вы можете получить только постоянную ссылку.

1 голос
/ 04 марта 2011

Проблема в том, что ваш C-cast, по-видимому, создает новый объект, а не выкачивает, как ожидалось.Поскольку этот новый объект является временным, он не может быть привязан к неконстантному ссылочному параметру для родительской операторной функции.Если вы static_cast ссылаетесь на родителя, оно должно работать:

operator>>( s, static_cast<A<int>&>(b));

...