Операторы потока, такие как:
virtual ostream& operator<<(ostream& stream, const BaseMessage objectArg) = 0;
просто не могут быть функциями-членами, и поэтому не могут быть виртуальными функциями. Причина этого в том, что когда вы говорите что-то вроде:
a << b;
вы действительно говорите
a.operator<<( b );
В этом случае a является потоком, а не экземпляром вашего класса, поэтому оператор не может быть членом вашего класса. Обычно вы должны сделать это бесплатной (не-членской) функцией, которая обращается к вашему экземпляру класса через подходящие функции-члены.
If you are using Objective-C++ (i.e. mixing Objective-C and C++ in one source file or importing a C++ header into an Objective-C file), then you should be using the .mm
extension on your source code files. By default, Xcode will compile .mm
files using the Objective-C++ compiler. .m
files are compiled using the standard C compiler.
Лучший способ диагностировать это - перетащить строку «Compiling foo.mm» из окна результатов сборки в ответ на это сообщение. Это показывает нам, что ваш проект сообщает компилятору, с мучительной подробностью, и покажет, что именно не так.