2011-09-14 136 views
12

我有一个类:私人模板功能

class C { 
private: 
    template<int i> 
    void Func(); 

    // a lot of other functions 
}; 

C.cpp

// a lot of other functions 

template<int i> 
void C::Func() { 
// the implementation 
} 

// a lot of other functions 

我知道,这不是最好的主意移动模板实现在CPP文件(因为它不会从其他cpp中看到,其中可能包含带有模板声明的标题)。

但私人功能呢?任何人都可以告诉我,在.cpp文件中是否存在实现私有模板函数的缺点?

+0

http://stackoverflow.com/questions/4315969/where-to-define-c-class-member-template-function-and-functors-that-instantiate/4316020#4316020 –

+1

虽然这个问题在技术上由Als和Nicola回答,对我来说,这只是引发了一个问题,为什么你根本没有成为会员模板。将它作为cpp文件(的未命名名称空间)中的免费函数模板不是更好吗?我发现,随着时间的推移,我越来越少地使用私有成员函数,越来越多地使用类的实现文件(的未命名名称空间)中的自由函数。 – sbi

回答

10

当函数模板以触发其实例化的方式使用时,编译器(在某些时候)需要看到该模板的定义。这就是原因,模板通常使用内联finctions在头文件中实现。

所以只要遵循上述规则,在头文件和源文件中分离接口和实现仍然可以。


参考:
C++ 03标准,§14.7.2.4:

定义非导出函数模板的,非导出的成员函数模板,或类模板的非导出成员函数或静态数据成员应存在于明确实例化的每个翻译单元中。

+0

这是不是矛盾:'所以只要遵循上述规则,在头文件和源文件中分离接口和实现仍然可以......“**与**相矛盾>>这就是模板的原因通常使用内联finctions在头文件中实现.',还是我错过了什么? – Nawaz

+0

@Nawaz:更新回答你的问题。心连心。 –

+0

这不能回答我的问题。你说,定义可以在.cpp文件中,怎么样? – Nawaz

6

除非您的私有成员函数模板被在类定义中内联定义的成员函数使用,否则我认为这种方法没有任何问题。相反,我认为对你的头文件的依赖性越少越好。

只要您强制执行总是的惯例,就可以在单个源文件中提供每个类的实现。