我正在尝试使用全局重载函数来实现模板,以便根据签名执行自定义操作。由于可能有一组类型(例如数字类型)具有类似的实现,因此我尝试使用概念来覆盖它,但遇到了一个问题,即编译器在没有显式实例化的情况下看不到概念的定义。
MSVC 17.13.0(/std:c++最新)
// my.hpp
template <typename value_type>
void bar(value_type value);
template <typename value_type>
void foo(value_type value)
{
bar<value_type>(value);
}
// my.cpp
#include "my.hpp"
#include <print>
#include <type_traits>
template<std::integral value_type>
void bar(value_type value)
{
std::println("bar(integral[{}])", value);
}
int main()
{
//bar(5);
foo(6);
}
上述程序无法构建,因为链接器看不到的bar
定义:
未解析的外部符号“void __cdecl bar(int)”(??$bar@H@@YAXH@Z) 在函数“void __cdecl foo(int)”(??$foo@H@@YAXH@Z) 中引用
bar(5);
但是,如果我取消注释中的行main()
,它显然会实例化概念约束模板,并且结果将是正确的(但直接调用会产生额外的输出bar(5)
):
bar(积分[5])
bar(积分[6])
是否有解决此类任务的通用模式?基本上,我希望接收类型的模板能够找到模板函数本身的合适定义,void bar<int>
就我的情况而言。