0

例を zeroc から少し変更したかっただけです (プリンターを使用した例)。それで、これがどのようになるかです。

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 を引数として使用したい場合、エラーが発生します。私はC ++のプロではないことを認めますが、これを修正する方法についての手がかりが不足しています。

4

1 に答える 1

0

ZeroC Ice は、浮動小数点パラメーターの独自の型を定義しますIce::Float。したがって、プレーンを使用floatしても機能せず、元のメソッドは未定義のままです。

さらに、型の使用とは別にIce::Float、引数は定数への参照としてではなく、値によって渡されるため、引数宣言の他の部分も削除する必要がありconstます&

結局のところ、エラー メッセージがすべてを示しています。メソッド シグネチャは次のようになります。

void printFloat(Ice::Float, const Ice::Current&)
于 2014-04-27T09:52:52.993 に答える