非内联成员函数的模板类

时间:2011-07-14 16:34:05

标签: c++ templates

我想在这里举个例子:

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

但我不想用我的类定义内联我的函数定义。

我必须把

template<typename Data>
concurrent_queue<Data>::

在我所有的函数defs和构造函数面前?

3 个答案:

答案 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()
{
}

这通常需要将类和函数拆分为单独的部分,但它们都需要在头文件中才能使模板起作用。