Реализация оператора << с классом :: factory (); - PullRequest
0 голосов
/ 27 декабря 2011

У меня есть универсальный (чисто виртуальный интерфейс) класс IFACE, и некоторый класс, который обрабатывает все подклассы IFACE следующим образом:

class IFACE{
};

class A{
public:  
   A& operator<<(IFACE& other);      
};

Все отлично работает со следующим:

class B:IFACE{
};

Но не с фабричными методами следующим образом:

class C:IFACE{
  static C factory(){
    C c;
    return c;
  }
}

С исполняемым файлом:

int main(){
  A a;
  B b;
  C c;
  C cc = C::factory();
  a<<b;               //Ok ...
  a<<c;               //Also ok...
  a<<cc;              //Again ok ...
  a<<C::factory();    //error below
  return 0;
}

error: no match for ‘operator<<’ in ‘A << C::factory()()’

Также не удается (та же ошибка):

 a<<(C::factory());

Теперь работает следующее: a<<&(C::factory());, но выдает предупреждение о взятии временного адреса.Я предполагаю, что это небезопасно, потому что я не могу контролировать, когда аноновый результат C :: factory () выйдет из области видимости. Это небезопасно?

Итак, моя следующая мысль:

class A{
  A& operator<<(IFACE* ifp);
  template<typename T>
  A& operator<<(T t){
    IFACE* ifp = static_cast<IFACE*>(&t);
    return (*this)<<ifp;
  }
}

Что компилируется нормально, но связывание main сверху дает ошибку:

undefined reference to 'A& A::operator<< <C>(C)'

Как это можно определить?

РЕДАКТИРОВАТЬ:

Было предложено, чтобы я реализовал:

A& A::operator<<(const IFACE& other)

Но это также не скомпилируется ... Я получаю следующую ошибку:

error: passing ‘const IFACE’ as ‘this’ argument of ‘virtual int <some method in IFACE>’ discards qualifiers

ОБНОВЛЕНИЕ: Эта проблема все еще не решена.

1 Ответ

2 голосов
/ 27 декабря 2011

Eser прав насчет причины проблемы, но не решения. Чтобы это исправить, все, что вам нужно сделать, это сделать ссылочную константу: operator<<(const iFACE&). Теперь ваш оператор также может работать с временными.

Не по теме: Вместо выполнения C c; return c; вы можете так же легко выполнить return C(), с тем же результатом, но с одной строкой меньше и, возможно, оптимизировать компилятор. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...