我无法访问此项目的c ++ 11.
我有一个C ++类;我们称之为Bar,它看起来像这样:
Header FooBar.h:
#include "Fancy.h" // <--- Dependency
namespace Foo
{
template<typename T>
class Bar : public Fancy::FancyClass<T, ALLOCATER<HARD_CODED_VALUE>>
{
};
}
.cpp的:
无
Fancy是一个静态链接到dll的lib。问题是,当其他项目想要使用dll时,它们包含“FooBar.h”,它说它找不到“Fancy.h”
基本上我希望包含dll的项目能够使用这个类而不需要任何额外的库或头文件。
我的解决方案是将其放在cpp中并且没有头文件。不幸的是什么都找不到呢?我试过创建一个无效的空白头文件。
我试图在标题中声明它但是要做到这一点我需要.h来理解FancyClass是什么。我也试过
namespace Fancy
{
class FancyClass;
class ALLOCATER;
}
namespace Foo
{
template<typename T>
class Bar : public Fancy::FancyClass<T, ALLOCATER<HARD_CODED_VALUE>>;
}
标题中的。但这会导致许多错误。
答案 0 :(得分:1)
简短回答,您必须在您的可执行文件中包含标题才能使用提供的库。
长(呃)回答,编译器需要知道库中定义的类的结构。
想象一下,有一个名为MyAwesomeClass
的类是您要在可执行文件中使用的库的一部分。当您说MyAwesomeClass awesome;
时,编译器对该类没有任何了解。它有多大?你可以用什么方法打电话?它是否继承了什么?
此信息包含在声明类的头文件中。
class MyAwesomeClass
{
private:
std::string _name;
public:
MyAwesomeClass();
MyAwesomeClass(const std::string& name);
void print_name();
};
实现是在DLL或静态库中定义的,但是当使用类型MyAwesomeClass
时,编译器至少需要知道它的结构。如果不包含标题,编译器会抱怨它不知道MyAwesomeClass
是什么类型(即undefined class
错误)。