gpt4 book ai didi

c++ - 在哪里定义同时包含模板和非模板成员的类?

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:15 25 4
gpt4 key购买 nike

我知道模板定义都应该放在头文件 [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() 的函数定义标记为 inline。这将允许您将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com