免责声明:我知道模板通常在头文件中实现.请仔细阅读.
我有一个与C++模板相关的问题.我的代码在Windows下使用MSVC构建,但在Mac OSX下不支持LLVM-Clang,但我不确定哪一个是错误的.
这是一个简单的测试用例,由三个源文件组成:
main.cpp中
#include "templ.h"
int main()
{
templ(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)templ.h
template<typename T>
T templ(const T&);
Run Code Online (Sandbox Code Playgroud)templ.cpp
#include "templ.h"
template<typename T>
T templ(const T& t)
{
return t;
}
//explicit instantiation
template int templ(const int&);
//implicit instantiation
void f()
{
templ(1);
}
Run Code Online (Sandbox Code Playgroud)如您所见,我希望函数模板的实现是私有的(即隐藏在.cpp文件中).为此,我必须在与其定义相同的翻译单元中实例化我的模板.在上面的例子中,我只是实例化templ<int>.AFAIK,这是不寻常的,但完全是cromulent C++.
因此,此代码与两个编译器一起构建.但是,如果我注释掉显式实例化并且只保留隐式实例化,则编译器的行为会有所不同.MSVC成功构建,但LLVM-Clang因以下链接器错误而失败:
Undefined symbols for architecture x86_64:
"int templ<int>(int const&)", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
此外,只有在启用优化(例如-02)时才会发生该错误.
标准对此有何看法?这是LLVM-Clang的已知行为/错误吗?
我的LLVM-Clang版本是:
Apple LLVM …Run Code Online (Sandbox Code Playgroud)