我知道模板定义应该全部进入头文件 [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" ...
理想情况下,我想在同一个文件中定义 bar
和 baz
因为它们密切相关。
- 但是如果我将所有实现都放在 header 中,我最终会多次定义
baz
。 - 如果我将所有实现放入
.cpp
中,则无法看到
或bar
和nest
的定义foo1.cppfoo2.cpp
。
我是否必须在单独的文件之间拆分 bar
和 baz
?
[1] 在使用 NVCC 编译 CUDA 代码的 MSVC++ 上,将模板声明为 inline
似乎对我不起作用。
最佳答案
But if I chuck all the implementation in the header, I'll end up multiply defining baz.
您仍然可以将 baz()
的函数定义标记为内联
。这将允许您将 baz()
的定义放入头文件中,而不会导致多个符号定义错误。
If I chuck all the implementation into a .cpp, then definitions for bar and nest can't be seen by foo1.cpp or foo2.cpp.
如果您事先知道函数模板将使用什么类型进行实例化,则可以在包含函数模板定义的 .cpp
文件中使用显式实例化。
template void cls::bar(int);
如果以上选项都不适合您,那么您将不得不放弃此要求:
Ideally I want to define bar and baz in the same file as they are so closely related.
并将成员函数模板的定义放在头文件中,非模板成员函数的定义放在.cpp
文件中。
关于c++ - 在哪里定义具有模板和非模板成员的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16496181/