我有一个头文件,用于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失败。
我的返回类型无效的一些指示可能会有所帮助。
答案 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(); }
};