我面临一个问题,其中包含的(外部)头文件中的声明类名与我自己的头文件的声明类名冲突。
但基本上我想用包含的类来组成我的类。
在 Golang 中,解决方案是使用名为 Import Declarations 的功能。
我已经搜索了几个主题和论坛,但找不到解决方案。
到目前为止我尝试过的(以及在下面的代码中可以看到的)是用自定义命名空间包围包含的 header 。但这会导致令人讨厌的链接问题(见下文),当我访问包含类的方法时。
我对 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
最佳答案
[备注] 致 future 读者:
请查看评论,因为它们更好地反射(reflect)了答案的全貌。
@Baruch 的以下回答为您提供了快速解决这种情况的方法。
但正如评论中所建议的,这个 可能 是外部库作者的一个糟糕的设计选择。
@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
关于C++ 使用来自另一个标识符下的头文件的包含类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59949501/