在哪里定义包含模板和非模板成员的类?

时间:2013-05-11 10:33:28

标签: c++ class templates

我知道模板定义应该全部进入头文件[1]。但是,如果我在一个类中同时拥有模板和非模板,该怎么办:

// cls.h
class cls {
public:
    template <typename U> void bar(U x);   // template
    void baz();                            // non-template
    template <typename V> class nest {
    };
};

// foo1.cpp
#include "cls.h" ...

// foo2.cpp
#include "cls.h" ...

理想情况下,我想在同一个文件中定义barbaz,因为它们密切相关。

  • 但如果我把标题中的所有实现都丢掉了,我最终会定义baz
  • 如果我将所有实施内容放入.cpp,则barnest无法看到foo1.cppfoo2.cpp的定义。< / LI>

我是否必须在单独的文件之间拆分barbaz

[1] 将模板声明为inline对我来说在使用NVCC编译CUDA代码的MSVC ++上似乎不起作用。

1 个答案:

答案 0 :(得分:5)

  

但是如果我把标题中的所有实现都丢掉了,我最终会多次定义baz。

您仍然可以将baz()的功能定义标记为inline。这将允许您将baz()的定义放在头文件中,而不会导致多个符号定义错误。

  

如果我把所有实现都放到.cpp中,那么foo1.cpp或foo2.cpp就无法看到bar和nest的定义。

如果您事先知道要使用哪种类型的函数模板进行实例化,则可以在包含函数模板定义的.cpp文件中使用显式实例化。

template void cls::bar(int);

如果上述选项都不适合您,那么您将不得不放弃此要求:

  

理想情况下,我想在同一个文件中定义bar和baz,因为它们非常密切相关。

将成员函数模板的定义放在头文件中,并在.cpp文件中定义非模板成员函数。