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

mch*_*hen 2 c++ templates class

我知道模板定义应该全部进入头文件[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" ...
Run Code Online (Sandbox Code Playgroud)

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

  • 但是如果我把标题中的所有实现都丢掉了,我最终会多次定义baz.
  • 如果我把所有的实现都放到a中.cpp,那么定义barnest不能被foo1.cpp或看到foo2.cpp.

我一定要拆分barbaz独立的文件之间?

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

And*_*owl 5

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

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

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

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

template void cls::bar(int);
Run Code Online (Sandbox Code Playgroud)

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

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

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