为什么模板专门化需要内联定义? 在Pr.4.4.1中给出的例子中,“加速C++、A. Koenig和B. E. Moo”,如果我实现了模板特化,像书中所示的那样,我就有问题了。
最低工作示例(自上而下)为:为什么模板专门化需要内联定义? 在Pr.4.4.1中给出的例子中,“加速C++、A. Koenig和B. E. Moo”,如果我实现了模板特化,像书中所示的那样,我就有问题了。,c++,templates,inline,specialization,multiple-definition-error,C++,Templates,Inline,Specialization,Multiple Definition Error,最低工作示例(自上而下)为: main.cpp: str.hpp: ptr.hpp: \ifndef-GUARD\u ptr\h #定义防护装置 #包括 模板T*克隆(常数T*tp); 模板标准::向量*克隆(常量 std::vector*vp); 模板类Ptr{ 公众: Ptr():refptr(新大小_t(1)),p(0){} Ptr(T*T):refptr(新尺寸_T(1)),p(T){} ~Ptr(); 私人: T*p; 尺寸*refptr; }; #包括“ptr.cpp” #恩迪
main.cpp:
str.hpp:
ptr.hpp:
\ifndef-GUARD\u ptr\h
#定义防护装置
#包括
模板T*克隆(常数T*tp);
模板标准::向量*克隆(常量
std::vector*vp);
模板类Ptr{
公众:
Ptr():refptr(新大小_t(1)),p(0){}
Ptr(T*T):refptr(新尺寸_T(1)),p(T){}
~Ptr();
私人:
T*p;
尺寸*refptr;
};
#包括“ptr.cpp”
#恩迪夫
ptr.cpp:
模板
Ptr::~Ptr()
{
如果(---*refptr==0){
删除refptr;
删除p;
}
}
模板
T*克隆(常数T*tp)
{
返回tp->clone();
}
模板
std::vector*克隆(常量std::vector*vp)
{
返回新的std::vector(*vp);
}
问题是最后一个模板专门化
template<> std::vector<char>*
模板std::vector*
它给出了一个
multiple definition of 'std::vector<char...>
“std::vector”的多重定义
错误。它只适用于
template<> inline std::vector<char>*
模板内联std::vector*
1) 我不完全理解为什么我需要“内联”
2) 这是书中的错误吗?我试图将此模板专门化放在ptr.hpp文件中。同样,它只适用于“inline”
感谢所有能够对这个问题有所了解的人。模板是在编译时生成的。所以如果你有这个:
template void func(T){/*…*/}
这-如果您使用类似以下内容:
func(5);
编译器将生成此函数:
void func(int t){/*…*/}
如果在单独的源文件中有模板类方法定义,则可以将其与主文件分开编译。编译器将无法确定要生成的函数。如果它是
内联的
,它基本上是一个宏,不能导出到另一个模块。@bolov,看起来像是一个错误的副本。这个问题是关于完全专门化的,实际上不必在头中实现。在我看来,这个示例中的主要问题是*.cpp文件包含在头文件中。这似乎是一个更好的复制目标,还有。
#include "str.hpp"
#ifndef GUARD_ptr_h
#define GUARD_ptr_h
#include <vector>
template<class T> T* clone(const T* tp);
template<> std::vector<char>* clone(const
std::vector<char>* vp);
template <class T> class Ptr {
public:
Ptr(): refptr(new size_t(1)), p(0) { }
Ptr(T* t): refptr(new size_t(1)), p(t) { }
~Ptr();
private:
T* p;
size_t* refptr;
};
#include "ptr.cpp"
#endif
template<class T>
Ptr<T>::~Ptr()
{
if (--*refptr == 0) {
delete refptr;
delete p;
}
}
template<class T>
T* clone(const T* tp)
{
return tp->clone();
}
template<>
std::vector<char>* clone(const std::vector<char>* vp)
{
return new std::vector<char>(*vp);
}
template<> std::vector<char>*
multiple definition of 'std::vector<char...>
template<> inline std::vector<char>*