首先,我目前正在为我的论文学习 C++,因此对这门语言缺乏经验。任何帮助表示赞赏。
我在我的代码中使用 fmt 库,并且可以格式化用户提供的类型的规范方式是通过专门化类模板类型fmt::formatter
。
例子
编译器资源管理器中的代码:https ://godbolt.org/z/2VO_wa
给定两个库A
and B
,它们都碰巧在其实现中大量使用 fmt 并且都以某种方式需要打印/记录当前时间。两者都可以合理地使用std::chrono::system_clock
,并且希望在几个点上对其进行格式化,每个人都定义了自己的版本,fmt::formatter<std::chrono::system_clock::time_point>
以使这个简单的代码成为可能:
auto msg = fmt::format("It is now {}", std::chrono::system_clock::now());
LibraryA
使用与 不同的实现B
,因为它考虑了本地时区而不是在 UTC 中打印。
现在这个例子非常具体,但由于类模板fmt::formatter
是格式化用户提供的类型的方法,这种情况可能会以一种或另一种形式发生。
问题
当我开发我的应用程序C
并使用两个(不相关的)库时A
,B
我相信会有两个相同类型(即fmt::formatter<std::chrono::system_clock::time_point>
)的不同实现,从而违反未定义行为的 ODR。
问题
假设我正确理解了情况,我的两个问题是:
C
有没有办法在不改变A
和B
上游的情况下避免应用程序中的这种冲突?- 如果可以修改其中一个
A
或B
(或两者),可以通过什么方式解决或完全防止冲突。