将模板类与引用非类型模板参数一起使用时出现链接器错误
Linker error when using template class with a reference non-type template parameter
我正在开发一个C++库,我需要在其中向用户提供类模板。
此类的模板参数是一个引用。但是,我收到链接器错误。下面是一个最小的测试用例:
测试.hh
#ifndef TEST_HH_
#define TEST_HH_
template <double const& val>
struct A{};
constexpr double zero = 0.;
A<zero> foo();
#endif // TEST_HH_
测试.cpp
#include "test.hh"
A<zero> foo(){ return A<zero>(); }
主.cpp
#include "test.hh"
int main()
{
foo();
}
编译这段代码时,我收到警告:
'A<zero> foo()' used but never defined
后跟链接器错误:
undefined reference to foo()
我试图用 int 替换双精度
:template <int val>
struct A{};
它链接(将int
作为参数 ofc 传递时),但我真的需要一个double
.
当模板类涉及链接错误时,我也尝试了一种常见的解决方案,我在 test.hh
中实现了 foo()
函数而不是 test.cpp
,但我想避免将所有代码放在标题中。
很高兴这没有链接!可能会更糟...
问题基本上是test.cpp
和main.cpp
都有名为 ::zero
的不同对象。这是违反 ODR 的 - 该变量有多个定义,并且最终A<zero>
技术上是不同的类型,因为A
的模板参数val
是对不同翻译单元中不同对象的引用。
希望这个解释能清楚地说明为什么A<int>
工作正常。
在 C++17 中,您需要:
inline constexpr double zero = 0.;
在 C++14 中,您要么需要在其中一个翻译单元中添加定义,要么执行其他一些魔法,例如::zero
本身是对某个静态模板变量或其他 voodoo 的引用。
相关文章:
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接