如何在使用模板时将cpp代码编译成库文件

时间:2018-05-31 02:52:38

标签: c++

我现在正在编写一个关于某种排序算法的项目,并且遇到了一些麻烦。这是我的项目结构。我说这很简单,可以节省你的时间

// ------- ------ Sort.h

#ifndef....
class Sort{
public:
    template <typename T>
    static bool foo(T* t_, ...);   //maybe more parameters
    ...                            //and maybe more functions
}
#endif

// -------- Foo.cpp中-----

#include "Sort.h"

template<typename T>
bool Sort::foo(T* t_, ...){
    ...                             //function implementation
    return true;
}
template bool Sort::foo<int>(int*, ...);
template bool Sort::foo<char>(int*, ...);

然而,我发现它不太好。我必须在每个.cpp文件的末尾具体模板功能。更重要的是,我不能将这些函数用于自定义类(因为我没有使用此类特定的函数)。

但是如果我在Sort.hpp文件中编写所有内容,我就无法将.hpp文件编译成.a或.lib。如何将项目编译成库文件,同时减少重复工作?

非常感谢您的帮助。

感谢

2 个答案:

答案 0 :(得分:0)

必须在头文件中声明模板。这就是他们工作的方式。头文件未编译,因为在使用您的库的任何代码中#include指令都需要它们。 Boost是如何组织模板库的一个很好的例子。

答案 1 :(得分:0)

将实现与声明分开是否有效并不总是很清楚。我试图始终保持一个类的标题和cpp文件分开,但我经常链接错误并依赖于编译器(或我猜的IDE),错误消息可能会有所不同,这令人沮丧。为避免这种情况,只需混合头文件中的实现即可。实施例

//头文件

 ...   
template<typename T>
class Array
{
public:
~Array() { if (elems != nullptr) delete[] elems; }

Array() : logical_len(0), allocated_len(4), elems(new T[4]) {}

Array(std::initializer_list<T> lst) : logical_len(0),
    allocated_len(lst.size() * 2), elems(nullptr) {
    elems = new T[allocated_len];
    for (const T& x : lst)
        push_back(x);
}
...

此时您有两种选择。您可以将头文件编译为cpp文件,或者只在main.cpp中编译#include它。