У меня есть файл заголовка, который предназначен для блока обработки радиосигнала GNU и для определения C ++ API.Как я писал в комментариях, он использует определение «друг» для безопасной обработки Boost Shared Pointers, чтобы не возникало случайных необработанных указателей (доступ к закрытым конструкторам).
Я не могу сказать, почему это не удается.Кажется, это связано с идентификаторами, используемыми в конструкторах.Определения классов, кстати.заканчивается знаком ";";)
Мое сообщение об ошибке сборки: (Я пометил соответствующие строки с помощью [точка n].
cogra_binary_slicer.h: 64: 66: ошибка: returnнедопустимая спецификация типа для конструктора [точка 1] cogra_binary_slicer.cc: в функции 'cogra_binary_slicer_sptr cogra_binary_slicer ()': cogra_binary_slicer.cc:42:41: ошибка: ожидаемый спецификатор типа [POINT 2] перед'cogra_binary_slicer' cogra_binary_slicer.cc:42:41: ошибка: ожидается ')' до 'cogra_binary_slicer' cogra_binary_slicer.cc:42:63: ошибка: не удалось преобразовать 'gnuradio :: get_initial_sptr (T *) с T = int' из 'из'boost :: shared_ptr 'to' cogra_binary_slicer_sptr {aka boost :: shared_ptr} '
Это, однако, сужает его до трех файлов.
Заголовок, cogra_binary_slicer.h:
#ifndef INCLUDED_COGRA_BINARY_SLICER
#define INCLUDED_COGRA_BINARY_SLICER
#include <cogra_api.h>
#include <gr_block.h>
class cogra_binary_slicer;
typedef boost::shared_ptr<cogra_binary_slicer> cogra_binary_slicer_sptr;
/*!
* \brief Return a shared_ptr to a new instance of cogra_binary_slicer.
*
* To avoid accidental use of raw pointers, cogra_binary_slicer's
* constructor is private. cogra_binary_slicer is the public
* interface for creating new instances.
*/
COGRA_API cogra_binary_slicer_sptr cogra_binary_slicer ();
class COGRA_API cogra_binary_slicer : public gr_block
{
private:
// The friend declaration allows cogra_binary_slicer to
// access the private constructor.
// [POINT 1]
friend COGRA_API cogra_binary_slicer_sptr cogra_binary_slicer ();
cogra_binary_slicer (); // private constructor
public:
~cogra_binary_slicer (); // public destructor
// Where all the action really happens
int general_work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
}; // yes
#endif /* INCLUDED_COGRA_BINARY_SLICER */
cogra_binary_slicer.cc, где создается экземпляр (который завершается ошибкой).Точка отказа помечена [POINT 2]:
#include <cogra_binary_slicer.h>
#include <gr_io_signature.h>
/*
* Create a new instance of cogra_binary_slicer and return
* a boost shared_ptr. This is effectively the public constructor.
*/
cogra_binary_slicer_sptr
cogra_binary_slicer ()
{
return gnuradio::get_initial_sptr(new cogra_binary_slicer ()); **[POINT 2]**
}
И заголовок API, cogra_api.h:
#ifndef INCLUDED_COGRA_API_H
#define INCLUDED_COGRA_API_H
#include <gruel/attributes.h>
#ifdef gnuradio_cogra_EXPORTS
# define COGRA_API __GR_ATTR_EXPORT
#else
# define COGRA_API __GR_ATTR_IMPORT
#endif
#endif /* INCLUDED_COGRA_API_H */
Я подключил столько источников, потому что не могу сузить, почемукомпиляция не удалась в определенных местах.
Могут быть полезны некоторые указания, почему мой тип возвращаемого значения недействителен.