提问人:Anon232 提问时间:6/15/2023 更新时间:6/21/2023 访问量:34
跨多个库的显式实例化
Explicit instantiation across multiple libraries
问:
如果我有一些带有模板实现的标题:
#ifndef FOOHEADER_HPP
#define FOOHEADER_HPP
template <typename T>
struct Foo
{
void FooFun(){}
};
#endif
还有两个 -files,它提供了此声明的显式实例:.cpp
FloatFoo.cpp:
#include "FooHeader.hpp"
template struct Foo<float>;
IntFoo.cpp:
#include "FooHeader.hpp"
template struct Foo<int>;
我可以将 -files 编译为库和 ..cpp
IntFoo.so
FloatFoo.so
这些实现将用于基于以下条件的可执行文件中:main.cpp
#include "FooHeader.hpp"
int main()
{
Foo<float> foo;
Foo<int> iFoo;
iFoo.FooFun();
foo.FooFun();
}
编译可执行文件时:
clang++ main.cpp -L./ -lIntFoo -lFloatFoo
我如何知道编译器是否实际使用了 中的实例化,或者它是否从 中的初始化中隐式实例化了新代码?IntFoo,FloatFoo
main.cpp
答:
0赞
Anon232
6/21/2023
#1
extern template struct Foo<>
正如 @fabian 所建议的那样,解决了这个问题。具有以下功能:main.cpp
main.cpp
#include "FooHeader.hpp"
extern template struct Foo<float>;
extern template struct Foo<int>;
int main()
{
Foo<float> foo;
Foo<int> iFoo;
iFoo.FooFun();
foo.FooFun();
}
如果库未链接,编译器将抛出错误。IntFoo
FloatFoo
评论
main.cpp
extern template struct Foo<float>; extern template struct Foo<int>;
FooHeader.hpp