跨多个库的显式实例化

Explicit instantiation across multiple libraries

提问人:Anon232 提问时间:6/15/2023 更新时间:6/21/2023 访问量:34

问:

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

#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 编译为库和 ..cppIntFoo.soFloatFoo.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,FloatFoomain.cpp

C++ 模板 链接器 显式实例化

评论

0赞 NathanOliver 6/15/2023
stackoverflow.com/questions/4448094/......
2赞 user7860670 6/15/2023
应将定义移动到 .cpp 文件中,以便编译器无法实例化新代码。
2赞 fabian 6/16/2023
您可以非常确定实例化模板。如果不添加到编译器中,就不知道您期望在其他翻译单元中完成实例化......main.cppextern template struct Foo<float>; extern template struct Foo<int>;FooHeader.hpp

答:

0赞 Anon232 6/21/2023 #1

extern template struct Foo<>正如 @fabian 所建议的那样,解决了这个问题。具有以下功能:main.cppmain.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();
}

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