如果我有一些带有模板实现的头:
#ifndef FOOHEADER_HPP
#define FOOHEADER_HPP
template <typename T>
struct Foo
{
void FooFun(){}
};
#endif
和两个.cpp
-文件,它提供了这个声明的显式示例化:
FloatFoo.cpp:
#include "FooHeader.hpp"
template struct Foo<float>;
IntFoo.cpp:
#include "FooHeader.hpp"
template struct Foo<int>;
我可以将.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
中的初始化隐式示例化了新代码?
1条答案
按热度按时间ki1q1bka1#
main.cpp
中的extern template struct Foo<>
解决了这个问题,正如@fabian所建议的那样。以下是main.cpp
:如果库
IntFoo
和FloatFoo
没有链接,编译器将抛出错误。