在第14.4.1节“加速的C ++,A。Koenig和B. E. Moo”给出的示例中,如果我实现书中介绍的模板专用化,则会遇到问题。 最小的工作示例(自上而下)是: 问题是最后一个模板专业化 它给出一个 错误。仅适用于 1)我不完全理解为什么我需要“内联”。 2)这是书中的错误吗?我试图将模板专用化放在ptr.hpp文件中。同样,它仅适用于“内联”。 感谢所有可以阐明此问题的人。 答案 0 :(得分:0) 模板是在编译时生成的。所以,如果你有这个: 这-如果您使用这样的东西: 编译器将生成此函数: 如果在单独的源文件中有模板类方法定义,则它可以与主文件分开编译。编译器将无法确定要生成的函数。如果它是g++ str.cpp main.cpp
main.cpp:
#include "str.hpp"
int main(int argc, char** argv)
{
Str n; //def
return 0;
}
str.hpp:
#ifndef GUARD_str_h
#define GUARD_str_h
#include <vector>
#include "ptr.hpp"
class Str {
public:
Str(): data(new std::vector<char>) { }
private:
Ptr< std::vector<char> > data;
};
#endif
str.cpp:
#include "str.hpp"
ptr.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
ptr.cpp:
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>*
1 个答案:
template <class T> void func(T t) { /*...*/ }
func<int>(5);
void func(int t) { /*...*/ }
inline
,则它基本上是一个宏,并且不能导出到另一个模块。