c++ - 在哪里定义具有模板和非模板成员的类?

标签 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 因为它们密切相关。

  • 但是如果我将所有实现都放在 header 中,我最终会多次定义 baz
  • 如果我将所有实现放入 .cpp 中,则 无法看到 barnest 的定义foo1.cppfoo2.cpp

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

[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/

相关文章:

java - Java中的类扩展实现

php - 带有 "use"关键字的可选命名空间

c++ - 将函数作为显式模板参数传递

c++ - 将 C 字符串和 vector 发送到 MurmurHash 会产生不一致的结果

c++ - 使用动态转换的 Lambda

c++ - 如何将元素从 STL 队列传递给函数?

javascript - 如何在 JavaScript 中检测数组中的对象属于哪个类

c++ - C++ 中的函数和函数指针

c++ - 调用专用模板函数时强制编译时错误

c++ - 在 "for"循环中使用的复制构造函数,但是在哪里?