У меня есть универсальный (чисто виртуальный интерфейс) класс 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
ОБНОВЛЕНИЕ: Эта проблема все еще не решена.