Возвращаем определение типа для конструктора - как исправить этот заголовок - PullRequest
1 голос
/ 05 января 2012

У меня есть файл заголовка, который предназначен для блока обработки радиосигнала 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 */

Я подключил столько источников, потому что не могу сузить, почемукомпиляция не удалась в определенных местах.

Могут быть полезны некоторые указания, почему мой тип возвращаемого значения недействителен.

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Переименуйте вашу функцию создания в другое имя, отличное от имени класса:

friend COGRA_API cogra_binary_slicer_sptr cogra_binary_slicer ();

В противном случае компилятор может увидеть его как конструктор с возвращаемым типом.

0 голосов
/ 05 января 2012

Вы должны переименовать свой класс или cogra_binary_slicer функцию.

Рассмотрим пример, который прекрасно компилируется:

class A;
A* B();


class A{
    friend A* B();
    A(){};
public:
    A(int i){}
};

A* B(){ return new A(); } 

и это не удается с ошибкой "ошибка C2380: тип (ы), предшествующий 'A' (конструктор с возвращаемым типом или недопустимое переопределение текущего имени класса?)"

class A;
A* A();


class A{
    friend A* A();
    A(){};
public:
    A(int i){}
};

A* A(){ return new A(); } 

Кроме того, вы должны рассмотреть возможность использования публичной статической функции-члена в вашем классе:

class A{
    A(){};
public:
    A(int i){}
    static A* getInstance(){ return new A(); }
};
0 голосов
/ 05 января 2012

В определении функции cogra_binary_slicer относится к функции, а не к классу.

Вам необходимо изменить new cogra_binary_slicer на new class cogra_binary_slicer.

Однако в определении класса, cogra_binary_slicer всегда будет ссылаться на класс, поэтому я не думаю, что есть какой-то способ сделать функцию другом.Поэтому я думаю, что ваш единственный выбор - дать классу и функции разные имена.Это также поможет уменьшить путаницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...