Интерфейс IDL, C++, CORBA, я имею дело с "конфликтующим типом возврата, указанным для" и "недопустимым абстрактным типом возврата для функции-члена" virtual..."

Уже более 3 дней я имею дело с CORBA и C++ и интерфейсом моего приложения, написанным на IDL.

Мой интерфейс приложения выглядит так:

#ifndef __FORUM_INTERFACE_IDL__
#define __FORUM_INTERFACE_IDL__

#include "Forum.idl"
typedef sequence<Forum> Forums;

interface ForumInterface
{
    Forums getForumList(in Forum f);
    Forums getUsersForumList(in long UsersID);
    void addNewTopic(in Forum f, in long UsersID, in string title);
};

#endif

Я "компилирую" его в файлы *.hh и *.cc: omniidl -bcxx ForumInterface.idl

Мой Forum-объект (также определенный в IDL) выглядит так:

#ifndef __FORUM_IDL__
#define __FORUM_IDL__

interface Forum
{
    long getForumID();
    void setForumID(in long id);
    string getForumName();
    void setFroumName(in string name);
    Forum getForumParent();
    void setForumParent(in Forum f);
};

#endif

Я "компилирую" его в файлы *.hh и *.cc: omniidl -bcxx Forum.idl

Я попытался написать реализацию как Forum, так и ForumInterface. Я начал с форума, вот определение класса FroumImpl:

#ifndef __FORUMIMPL_H__
#define __FORUMIMPL_H__

#include "Forum.hh"

class ForumImpl : public POA_Forum
{
    private :

        long id;
        char *name;
        ForumImpl parent;

    public :

        long getForumID();
        void setForumID(long id);
        char* getForumName();
        void setFroumName(const char* name);
        ForumImpl getForumParent();
        void setForumParent(ForumImpl f);
};

#endif

и это объявление (пока оно пустое):

#include "ForumImpl.h"

long ForumImpl::getForumID(){}
void ForumImpl::setForumID(long id){}
char* ForumImpl::getForumName(){}
void ForumImpl::setFroumName(const char* name){}
ForumImpl ForumImpl::getForumParent(){}
void ForumImpl::setForumParent(ForumImpl f){}

Я пытался скомпилировать это,

g++ -c ForumImpl.cpp -I$OMNIORB_HOME/include -I$OMNIORB_HOME/include/omniORB4

но получил ошибки:

В файле, включенном в ForumImpl.cpp:1:0: ForumImpl.h:12:19: ошибка: поле 'parent' имеет неполный тип ForumImpl.h:20:19: ошибка: конфликтный тип возврата, указанный для 'virtual ForumImpl ForumImpl::getForumParent() 'Forum.hh:161:21: ошибка: переопределение' virtual _objref_Forum* _impl_Forum::getForumParent() 'ForumImpl.h:20:19: ошибка: недопустимый абстрактный тип возврата для функции-члена' virtual ForumImpl ForumImpl::getForumParent() 'ForumImpl.h:6:7: note: потому что следующие виртуальные функции являются чистыми внутри' ForumImpl ': Forum.hh:162:16: note: virtual void _impl_Forum::setForumParent(Forum_ptr) ForumImpl.h:21:14: ошибка: невозможно объявить параметр 'f' как абстрактный тип 'ForumImpl' ForumImpl.h:6:7: note: поскольку тип 'ForumImpl' имеет чисто виртуальные функции ForumImpl.cpp: в функции-члене 'virtual ForumImpl ForumImpl::getForumParent() ': ForumImpl.cpp:7:11: ошибка: неверный абстрактный тип возврата для функции-члена' virtual ForumImpl ForumImpl::getForumParent() 'ForumImpl.h:6:7: note: начиная с типа' F orumImpl 'имеет чисто виртуальные функции ForumImpl.cpp: в глобальном масштабе: ForumImpl.cpp:8:42: ошибка: невозможно объявить параметр' f 'абстрактного типа' ForumImpl 'ForumImpl.h:6:7: note: с типа ForumImpl имеет чисто виртуальные функции

хуже всего то, что я понятия не имею, почему этот код дает мне такие ошибки... Я имею в виду, я определил все ForumImpl функции... так что любой из них является виртуальным. Я часами пытался понять, что с этим не так, но понятия не имею:(

Кто-нибудь может помочь? Мои файлы: http://www6.zippyshare.com/v/69552292/file.html Я добавил в этот архив tar файл Makefile, поэтому просто запустите команду "make all", и это все сделает.

Я был бы очень признателен, если бы кто-нибудь мог рассказать, почему я получил эту ошибку и что нужно сделать, чтобы это исправить, мне это действительно нужно. Ура:)

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

Я изменил мой ForumImpl.h и ForumImpl.cpp:

#ifndef __FORUMIMPL_H__
#define __FORUMIMPL_H__

#include "Forum.hh"

class ForumImpl : public POA_Forum
{
    private :

        long id;
        char *name;
        ForumImpl *parent;

    public :

        long getForumID();
        void setForumID(long id);
        char* getForumName();
        void setFroumName(const char* name);
        ForumImpl* getForumParent();
        void setForumParent(ForumImpl *f);
};

#endif

#include "ForumImpl.h"
long ForumImpl::getForumID(){}
void ForumImpl::setForumID(long id){}
char* ForumImpl::getForumName(){}
void ForumImpl::setFroumName(const char* name){}
ForumImpl* ForumImpl::getForumParent(){}
void ForumImpl::setForumParent(ForumImpl *f){}

но это дало мне те ошибки:

g ++ -c ForumImpl.cpp -IMNIORB_HOME / include -IMNIORB_HOME / include / omniORB4 В файле, включенном в ForumImpl.cpp:1:0: ForumImpl.h:20:20: ошибка: недопустимый ковариантный тип возврата для "виртуального ForumImpl* ForumImpl::getForumParent() 'Forum.hh:161:21: ошибка: переопределение' virtual _objref_Forum* _impl_Forum::getForumParent() '

2 ответа

Решение

Подпись для ForumImpl::getForumParent() должен выглядеть так:

Forum_ptr getForumParent();

Для получения дополнительной информации вы должны загрузить документ сопоставления IDL для C++ с веб-сайта OMG. Также ознакомьтесь с книгой Хеннинга и Виновски " Расширенное программирование на CORBA с C++".

Сигнатуры методов в ForumImpl должны соответствовать базовому классу, созданному в Forum.hh. Они должны вернуть только форум. Я не знаю omniorb в деталях, но у TAO есть сотни примеров, которые используют это, например, пример нашего банка, вы также можете найти его в Интернете по адресу https://svn.dre.vanderbilt.edu/viewvc/Middleware/trunk/TAO/examples/Simple/bank/

Другие вопросы по тегам