构造函数的返回类型定义 - 如何修复此标头

时间:2012-01-05 13:09:05

标签: c++ header cmake

我有一个头文件,用于GNU无线电信号处理块,以及定义C ++ API。正如我在评论中所写,它使用“朋友”定义以便以安全的方式处理Boost共享指针,因此不会发生偶然的原始指针(访问私有构造函数)。

我不能说为什么会失败。它似乎与构造函数使用的标识符有关。类定义顺便说一句。以“;”结尾;)

我的构建错误消息是(我用[point n]标记了有问题的行。

  

cogra_binary_slicer.h:64:66:错误:返回类型规范   构造函数无效[第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:错误:   无法使用T = int转换'gnuradio :: get_initial_sptr(T *)'   从'boost :: shared_ptr'到'cogra_binary_slicer_sptr {aka   升压:: 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 */

我附上了那么多来源,因为我无法缩小为什么编译在特定的locs失败。

我的返回类型无效的一些指示可能会有所帮助。

3 个答案:

答案 0 :(得分:3)

将您的创建函数重命名为类名以外的其他内容:

friend COGRA_API cogra_binary_slicer_sptr cogra_binary_slicer ();

否则,编译器可能会将其视为具有areturn类型的构造函数。

答案 1 :(得分:0)

在函数定义中,cogra_binary_slicer指的是函数,而不是类。

您需要将new cogra_binary_slicer更改为new class cogra_binary_slicer

但是,在类定义中,cogra_binary_slicer将始终引用该类,因此我认为没有任何方法可以使该函数成为朋友。所以我认为你唯一的选择是赋予类和函数不同的名称。这也有助于减少混淆。

答案 2 :(得分:0)

您应该重命名您的班级或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(); }
};