我想在这里举个例子:
但我不想用我的类定义内联我的函数定义。
我必须把
template<typename Data>
concurrent_queue<Data>::
在我所有的函数defs和构造函数面前?
答案 0 :(得分:3)
是的,您将,并且定义仍然需要在头文件中。这就是为什么每个人都使用内联定义 - 因为它们基本上必须是内联的。
答案 1 :(得分:2)
是的,没有办法绕过这种语法(除了使用令牌生成符号 - 破坏邪恶的邪恶#define
宏)。
就个人而言,我要么在类模板声明/定义中内联它们,要么为了更好的自我文档,将定义放入一些“inl”文件中,如下所示:
foo.h中
#ifndef FOO_H
#define FOO_H
namespace bar {
template <typename T>
class Foo {
public:
Foo () ;
virtual ~Foo();
};
}
#include "foo.inl.h"
#endif // FOO_H
foo.inl.h
#ifndef FOO_INL_H
#define FOO_INL_H
namespace bar {
template <typename T>
inline Foo<T>::Foo () {
}
template <typename T>
inline Foo<T>::~Foo () {
}
}
#endif // FOO_INL_H
请注意,我明确声明了它们inline
。这样可以提高样式的一致性,如果您碰巧专门化了模板,则无论如何都必须这样做:
template <>
inline Foo<int>::Foo() {
}
如果没有inline
,你会遇到与在头文件中定义的普通函数中忘记它时相同的痛苦(读取:多个定义错误)。
答案 2 :(得分:0)
这些函数不需要内联,但如果它们位于头文件中则更好:
/* in .h file */
template<class T>
class A
{
public:
void f();
}
/* this also in .h file */
template<class T>
void A<T>::f()
{
}
这通常需要将类和函数拆分为单独的部分,但它们都需要在头文件中才能使模板起作用。