Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么模板专门化需要内联定义? 在Pr.4.4.1中给出的例子中,“加速C++、A. Koenig和B. E. Moo”,如果我实现了模板特化,像书中所示的那样,我就有问题了。_C++_Templates_Inline_Specialization_Multiple Definition Error - Fatal编程技术网

为什么模板专门化需要内联定义? 在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>*