c++ 跨多个库的显式示例化

p1iqtdky  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(119)

如果我有一些带有模板实现的头:

  1. #ifndef FOOHEADER_HPP
  2. #define FOOHEADER_HPP
  3. template <typename T>
  4. struct Foo
  5. {
  6. void FooFun(){}
  7. };
  8. #endif

和两个.cpp-文件,它提供了这个声明的显式示例化:
FloatFoo.cpp:

  1. #include "FooHeader.hpp"
  2. template struct Foo<float>;

IntFoo.cpp:

  1. #include "FooHeader.hpp"
  2. template struct Foo<int>;

我可以将.cpp-文件编译为库IntFoo.soFloatFoo.so
这些实现将在基于main.cpp的可执行文件中使用:

  1. #include "FooHeader.hpp"
  2. int main()
  3. {
  4. Foo<float> foo;
  5. Foo<int> iFoo;
  6. iFoo.FooFun();
  7. foo.FooFun();
  8. }

编译可执行文件时:

  1. clang++ main.cpp -L./ -lIntFoo -lFloatFoo

我如何知道编译器是否真的使用了IntFoo,FloatFoo中的示例化,或者它是否从main.cpp中的初始化隐式示例化了新代码?

ki1q1bka

ki1q1bka1#

main.cpp中的extern template struct Foo<>解决了这个问题,正如@fabian所建议的那样。以下是main.cpp

  1. #include "FooHeader.hpp"
  2. extern template struct Foo<float>;
  3. extern template struct Foo<int>;
  4. int main()
  5. {
  6. Foo<float> foo;
  7. Foo<int> iFoo;
  8. iFoo.FooFun();
  9. foo.FooFun();
  10. }

如果库IntFooFloatFoo没有链接,编译器将抛出错误。

相关问题