Lay*_*ayl 5 c++ llvm-clang c++14
我正在尝试使用模板结构实现一个简单的系统,代码非常简单并且可以使用 MSVC 编译良好,但我无法理解为什么 CLANG 给我这个错误:“lld-link : error : undefined symbol: public: static struct FMyStruct常量 TSpec<1>::m_struct"
我在 Windows 64 位机器上使用 VisualStudio IDE 进行编译,但使用 CLANG LLVM 作为编译器。该代码在 MSVC 中运行良好。我将问题简化到最低限度,我尝试将所有内容放入一个 cpp 文件中,但没有结果。我还尝试了显式模板实例化。我想要兼容 C++14,而不是 C++17。我尝试过的一件事是,将 m_struct 成员声明为内联变量,但随后我收到此警告:“内联变量是 C++17 扩展”
struct FMyStruct
{
const int _p0;
const int _p1;
const int _p2;
};
template< int > struct TSpec {
static constexpr FMyStruct m_struct = { 0, 0, 0 };
};
FMyStruct
Function( int i )
{
return TSpec< 1 >::m_struct;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
"lld-link : error : undefined symbol: public: static struct FMyStruct const TSpec<1>::m_struct"
Run Code Online (Sandbox Code Playgroud)
我希望链接器找到符号 m_struct,因为它是在它旁边定义的......最奇怪的部分是,如果我尝试:
"lld-link : error : undefined symbol: public: static struct FMyStruct const TSpec<1>::m_struct"
Run Code Online (Sandbox Code Playgroud)
该程序将编译良好。
编辑:我的 CLANG 版本是 9.0.0,来自官方网站的针对 Windows 的预构建分布式版本。
clang version 9.0.0 (trunk)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
Run Code Online (Sandbox Code Playgroud)
这确实似乎是与 CLANG 版本相关的错误,感谢@Sombrero Chicken 指出了这一点。
所以这绝对很奇怪,但我设法通过在模板结构定义之后添加以下内容来解决这个问题,避免静态成员的 C++17 特定“内联”声明:
template< int N > const FMyStruct TSpec< N >::m_struct;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,它似乎与模板声明完全无关。作为总结,它给出了可以正常编译的程序。
struct FMyStruct
{
const int _p0;
const int _p1;
const int _p2;
};
template< int > struct TSpec {
static constexpr FMyStruct m_struct = { 0, 0, 0 };
};
template< int N > const FMyStruct TSpec< N >::m_struct;
FMyStruct
Function( int i )
{
return TSpec< 1 >::m_struct;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我仍然不明白为什么这是必要的,因为静态成员对结构是公共的,并且是同一单元和文件的一部分;我想这是另一回事,但我想得到启发。谢谢。
| 归档时间: |
|
| 查看次数: |
9849 次 |
| 最近记录: |