Интерфейс 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/