我现在正在编写一个关于某种排序算法的项目,并且遇到了一些麻烦。这是我的项目结构。我说这很简单,可以节省你的时间
// ------- ------ 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。如何将项目编译成库文件,同时减少重复工作?
非常感谢您的帮助。
感谢
答案 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它。