【问题标题】:C++ only implementation of template class模板类的仅 C++ 实现
【发布时间】:2016-02-22 19:15:57
【问题描述】:

我无权访问此项目的 c++11。

我有一个 C++ 课程;让我们称它为 Bar,它看起来像这样:

头文件 FooBar.h:

#include "Fancy.h" // <--- Dependency
namespace Foo
{
    template<typename T>
    class Bar : public Fancy::FancyClass<T, ALLOCATER<HARD_CODED_VALUE>>
    {
    };
}

Cpp:

Fancy 是一个静态链接到 dll 的库。问题是当其他项目想要使用它们包含“FooBar.h”的 dll 时,它说它找不到“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>>;
}

在标题中。但这会导致很多错误。

【问题讨论】:

  • 几乎您唯一的选择是将库包含路径添加到搜索路径或使用类似 PIMPL 模式的东西。我猜选择你的毒药。
  • 你能限制一些T吗?
  • 你不能。您的 Bar 取决于 Fancy,具体取决于用户提供的参数 T,因此用户需要查看 Fancy::FancyClass 定义。这里没有粉刺可以提供帮助。
  • 不,T 必须是任何类。它是一个容器。
  • “我有一个 C++ 类;我们称之为 Bar”——不。 Bar 是一个模板,而不是一个类。这是制作课程的模式。 Bar&lt;int&gt; 是一个类。

标签: c++ templates


【解决方案1】:

简短回答,您必须在可执行文件中包含标头才能使用提供的库。

Long(er) 答案,编译器需要知道库中定义的类的结构。

假设有一个名为MyAwesomeClass 的类是您要在可执行文件中使用的库的一部分。当您说MyAwesomeClass awesome; 时,编译器对该类一无所知。它有多大?你可以调用什么方法?它是否继承自任何东西?

此信息包含在声明类的头文件中。

class MyAwesomeClass
{
    private:
        std::string _name;
    public:
        MyAwesomeClass();
        MyAwesomeClass(const std::string& name);
        void print_name();
};

实现是在DLL或静态库中定义的,但是当使用MyAwesomeClass类型时,编译器至少需要知道它的结构。如果不包含标头,编译器会抱怨它不知道MyAwesomeClass 是什么类型(即undefined class 错误)。

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 2014-11-02
    • 2013-09-24
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多