2

我知道模板定义应该全部进入头文件 [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
  • 如果我将所有实现放入 a.cpp中,则barand的定义nest不能被foo1.cppor看到foo2.cpp

我必须在单独的文件之间bar进行拆分吗?baz

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

4

1 回答 1

5

但是如果我把所有的实现都放在头文件中,我最终会多重定义baz。

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

如果我将所有实现放入 .cpp,则 foo1.cpp 或 foo2.cpp 看不到 bar 和 nest 的定义。

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

template void cls::bar(int);

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

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

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

于 2013-05-11T10:35:23.250 回答