我面临的一个问题是,包含的(外部)头文件中的已声明类名与我自己的头文件中的已声明类名冲突。但基本上,我想用包含的类来构成我的类。在Golang中,一种解决方案是使用称为导入声明的功能。
我该如何实现:
正确的术语是什么?
我已经在搜索多个主题和论坛,但无法提出解决方案。我到目前为止尝试过的(以及在下面的代码中可以看到的)是用自定义名称空间包围包含的标头。但是,当我访问包含类的方法时,这会导致令人讨厌的链接问题(请参见下文)。我是C ++的新手,所以我对如何实现这一点的详尽解释感到非常高兴。
外部头文件(“ some / sensor.h”):
class Sensor {
public:
Sensor(unsigned char a, unsigned char b);
/*some definitions...*/
};
我的声明(“ sensor.h”):
namespace Lib {
#include "some/sensor.h"
};
class Sensor {
private:
Lib::Sensor s; /* use foreign object as member */
public:
Sensor();
void init(unsigned char p);
};
收到如下错误:
In function `Sensor::init(unsigned char)':
undefined reference to `Lib::Sensor::Sensor(unsigned char, unsigned char)'
/* ...and so on... */
collect2: error: ld returned 1 exit status
请查看评论,因为它们能更好地反映答案的全部情况。@ Baruch的以下回答为您提供了快速解决此问题的方法。但是,正如评论中所建议的那样,对于外部库的作者来说,这可能是一个糟糕的设计选择。
您应该将代码放在命名空间中,而不是外部代码中
#include "some/sensor.h"
namespace MyLib {
class Sensor {
private:
::Sensor s; /* use foreign object as member */
public:
Sensor();
void init(unsigned char p);
};
}
链接错误是由以下事实引起的:您实际上声明了一个新类型Lib::Sensor
,该类型未在任何地方定义。中定义的类some/sensor.cpp
是Sensor
,不是Lib::Sensor
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句