gpt4 book ai didi

c++ - OSX clang++:用于cpp文件中显式实例化的模板的架构x86_64的 undefined symbol

转载 作者:行者123 更新时间:2023-12-01 15:12:51 24 4
gpt4 key购买 nike

我在.h文件中定义了模板类,而在.cpp文件中定义了模板方法。该.cpp文件还包含通过template clas Class<type>的显式模板实例化。

此用例在VS2019上与GCC(7.4.0)相同,可以正常工作。但是,它在使用clang++(Apple LLVM版本10.0.0 clang-1000.11.45.5)的OSX上不起作用。

根据文档,我认为这是有效的代码。有什么办法可以使其在OSX clang下工作吗?

我不希望将所有实现都移到.h,因为它具有更好的可读性,并且我只需要两个/三个模板实例化。

这是我的测试文件:
test.h

#pragma once

template <class T>
class CTemplateTest
{
public:
int Test();
};
test.cpp
#include "test.h"

template class CTemplateTest<int>;
template class CTemplateTest<double>;

template <class T>
int CTemplateTest<T>::Test()
{
return 42;
}
main.cpp
#include "test.h"
int main(int argc, char** argv)
{

CTemplateTest<int> t1;
CTemplateTest<double> t2;

t1.Test();
t2.Test();
}
output
Undefined symbols for architecture x86_64:
"CTemplateTest<double>::Test()", referenced from:
_main in main.o
"CTemplateTest<int>::Test()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64

谢谢你的帮助。

最佳答案

成员函数未实例化。这并不奇怪,因为您在定义CTemplateTest<T>::Test之前进行了显式实例化。将显式实例移到test.cpp的末尾

template <class T>
int CTemplateTest<T>::Test()
{
return 42;
}

template class CTemplateTest<int>;
template class CTemplateTest<double>;

我建议您在 header 中添加一个显式的实例化声明
template <class T>
class CTemplateTest
{
public:
int Test();
};

extern template class CTemplateTest<int>;
extern template class CTemplateTest<double>;

当使用特定的特化时,这指示编译器放弃很多隐式实例化。它将知道完整的定义在其他地方。

而且,它有很好的文档目的。现在,只需阅读标题即可知道受支持的类型。

关于c++ - OSX clang++:用于cpp文件中显式实例化的模板的架构x86_64的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62322604/

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