Estou tentando implementar o modelo usando uma função globalmente sobrecarregada para executar ações personalizadas por assinatura. Como pode haver um grupo de tipos (por exemplo, tipos numéricos) com uma implementação semelhante, tentei usar conceitos para cobri-lo, mas tropecei no problema em que o compilador não vê a definição com conceito sem instanciação explícita.
MSVC 17.13.0 (/std:c++latest)
// 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);
}
O programa acima não é compilado porque o vinculador não vê bar
a definição de :
símbolo externo não resolvido "void __cdecl bar(int)" (??$bar@H@@YAXH@Z) referenciado na função "void __cdecl foo(int)" (??$foo@H@@YAXH@Z)
Porém, se eu descomentar a linha bar(5);
em main()
, isso obviamente instanciará o modelo restrito ao conceito, e o resultado será adequado (mas com saída extra da chamada direta bar(5)
):
barra(integral[5])
barra(integral[6])
Existe um padrão comum para resolver tal tarefa? Basicamente, eu quero que o template que recebe o tipo seja capaz de encontrar a definição adequada da função template em si, void bar<int>
no meu caso.
Primeiro,
são duas sobrecargas diferentes.
Em segundo lugar, então em
A menos que o ADL entre em ação,
bar<value_type>(value);
refere-se ao #1 (o único visível). Conforme você usavalue_type=int
, o ADL (Argument-Dependent Lookup) não está envolvido.Se você adicionar um parâmetro fictício para habilitar o ADL , você poderá ter:
Demonstração