4Manuals

  • PDF Cloud HOME

为什么模板特化需要内联定义? Download

    获取Hough线的交点OpenCV C ++ 如何将字符串“ text1”设置为包含项目text1,text2,test3的组合框的选定项目? 为什么System.Net.Mail.MailAddress构造函数在域部分中解析带有斜杠“ /”的电子邮件? Android 10,API29:在应用程序文件夹中使用C ++库编写文件会使应用程序崩溃 Unity-LineRenderer没有出现在版本(2D)上 按下按钮后,电话中未显示通知 ASP.net,使用WebConfig httpErrors重定向到区域内的控制器不起作用 获取会议室详细信息 我们如何将参数Line转换为Station? 网络核心:查找实体框架核心的主键和反射

在第14.4.1节“加速的C ++,A。Koenig和B. E. Moo”给出的示例中,如果我实现书中介绍的模板专用化,则会遇到问题。

最小的工作示例(自上而下)是:

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)我不完全理解为什么我需要“内联”。

2)这是书中的错误吗?我试图将模板专用化放在ptr.hpp文件中。同样,它仅适用于“内联”。

感谢所有可以阐明此问题的人。

1 个答案:

答案 0 :(得分:0)

模板是在编译时生成的。所以,如果你有这个:

template <class T> void func(T t) { /*...*/ }

这-如果您使用这样的东西:

func<int>(5);

编译器将生成此函数:

void func(int t) { /*...*/ }

如果在单独的源文件中有模板类方法定义,则它可以与主文件分开编译。编译器将无法确定要生成的函数。如果它是inline,则它基本上是一个宏,并且不能导出到另一个模块。



Similar searches
    熊猫如何获得基于另一列的百分比? 显示/隐藏部分,具体取决于选中的复选框 Python从字符串中过滤出所有域和电子邮件地址 VueJS无法呈现此文本 如何减少Chrome的初始化时间?