Я просто хотел немного изменить пример с нуля (тот, что с принтером).
Так вот как это происходит.
Вот небольшой интерфейс в файле Pritner.ice:
#pragma once
module Demo
{
interface Printer
{
void printString(string s);
void printFloat(float val);
};
};
и класс со стороны сервера, который выдает ошибки.
#include <Ice/Ice.h>
#include <Printer.h>
using namespace std;
using namespace Demo;
class PrinterI : public Printer
{
public:
virtual void printString(const string &, const Ice::Current&);
virtual void printFloat(const float &, const Ice::Current&);
};void
PrinterI::
printFloat(const float &val,const Ice::Current&)
{
cout<<val<<endl;
}
void
PrinterI::
printString(const string &s, const Ice::Current&)
{
cout << s << endl;
}
ошибка выглядит так:
Server.cpp: In function ‘int main(int, char**)’:
Server.cpp:49:37: error: cannot allocate an object of abstract type ‘PrinterI’
Ice::ObjectPtr object = new PrinterI;
^
Server.cpp:16:7: note: because the following virtual functions are pure within ‘PrinterI’:
class PrinterI : public Printer
^
In file included from Server.cpp:11:0:
./Printer.h:430:18: note: virtual void Demo::Printer::printFloat(Ice::Float, const Ice::Current&)
virtual void printFloat(::Ice::Float, const ::Ice::Current& = ::Ice::Current()) = 0;
^
make: *** [Server.o] Error 1
код в основном:
int
main(int argc, char* argv[]){
int status = 0;
Ice::CommunicatorPtr ic;
try
{
ic = Ice::initialize(argc, argv);
Ice::ObjectAdapterPtr adapter =
ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -h localhost -p 10000");
Ice::ObjectPtr object = new PrinterI;
adapter->add(object, ic->stringToIdentity("SimplePrinter"));
adapter->activate();
ic->waitForShutdown();
}
catch(const Ice::Exception& e)
{
cerr << e << endl;
status = 1;
}
catch(const char* msg)
{
cerr << msg << endl;
status = 1;
}
if(ic)
{
try
{
ic->destroy();
}
catch(const Ice::Exception& e)
{
cerr << e << endl;
status = 1;
}
}
return status;
}
Часть для printString в порядке и работает хорошо, но когда я хочу иметь float в качестве аргумента в функции intreface, то это приводит к ошибке.
Я признаю, что я не профессионал в C ++, но у меня просто не осталось никаких подсказок о том, как это исправить.
ZeroC Ice определяет свой собственный тип для параметров с плавающей запятой, Ice::Float
, Поэтому, используя простой float
не выполняет работу, и оригинальный метод остается неопределенным.
Кроме того, кроме использования Ice::Float
тип, аргумент передается по значению, а не как ссылка на константу, поэтому вы должны удалить другие части в объявлении аргумента, как const
а также &
также.
В конце концов, сообщение об ошибке говорит само за себя — подпись метода должна выглядеть точно так:
void printFloat(Ice::Float, const Ice::Current&)