当前位置:  开发笔记 > 编程语言 > 正文

C++模板实例化函数模板参数

如何解决《C++模板实例化函数模板参数》经验,为你挑选了1个好方法。

我使用模板实例化[*]有以下问题.

文件foo.h

class Foo
{
public:
    template 
    void func(F f)

private:
    int member_;
};

文件foo.cc

template 
Foo::func(F f)
{
     f(member_);
}

file caller.cc

Foo::func(boost::bind(&Bar::bar_func, bar_instance, _1));

虽然编译良好,但链接器会抱怨未定义的符号:

void Foo::func

如何实例化该功能 Foo::func?由于它需要一个函数作为参数,我有点困惑.我试图在foo.cc中添加一个实例化函数,因为我习惯使用常规的非函数类型:

instantiate()
{
    template<> void Foo::func >(boost::function);
}

显然,这不起作用.如果有人能指出我正确的方向,我将不胜感激.

谢谢!

[*]是的,我读了parashift FAQ lite.



1> Daniel Earwi..:

答案取决于编译器.某些版本的Sun C++编译器可以通过构建模板函数实现的缓存来自动处理这些模板,这些实现将在不同的翻译单元之间共享.

如果您使用的是Visual C++以及任何其他无法执行此操作的编译器,您也可以将函数定义放在标题中.

如果多个.cc文件包含标头,请不要担心重复定义.编译器使用特殊属性标记模板生成的方法,因此链接器知道丢弃重复项而不是抱怨.这就是为什么C++具有"一个定义规则"的原因之一.

编辑:以上注释适用于您的模板必须能够链接给定任何类型参数的一般情况.如果您知道客户端将使用的一组封闭类型,则可以通过在模板的实现文件中使用显式实例化来确保它们可用,这将导致编译器生成要链接的其他文件的定义.但是在一般情况下,您的模板需要使用可能只为客户端所知的类型,那么将模板分成头文件和实现文件几乎没有意义; 无论如何,任何客户都需要包括这两个部分.如果要将客户端与复杂的依赖关系隔离,请隐藏非模板化函数后面的依赖关系,然后从模板代码中调用它们.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有