C ++只实现模板类

时间:2016-02-22 19:15:57

标签: c++ templates

我无法访问此项目的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>>;
}
标题中的

。但这会导致许多错误。

1 个答案:

答案 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错误)。