Problema com parâmetro de modelo de modelo no modelo de função

Nov 08 2020

Estou tentando usar um parâmetro de modelo de modelo e meu código não compila.

template<class DataType, template<class T> class Container>
void foo(Container<DataType> test)
{
    
}

int main()
{
    std::vector<int> testVec{1,2,3,4};
    
    foo<int, std::vector>(testVec);
}

A mensagem de erro é "Nenhuma função correspondente para chamar 'foo'.

  1. Modelo de candidato ignorado: argumento inválido especificado explicitamente para o parâmetro do modelo 'Container' "

Alguém pode me ajudar?

Respostas

2 max66 Nov 08 2020 at 12:25

Sugestão: experimente com

// ...............................VVVVVVVVV
template<class DataType, template<class ...> class Container>
void foo(Container<DataType> test)
{
    
}

O problema é que std::vectoraceita dois parâmetros de modelo de tipo; o segundo com um valor padrão.

Se você escrever

// ...............................VVVVVVV
template<class DataType, template<class T> class Container>

você pede um parâmetro de modelo de modelo que aceita um parâmetro de modelo de tipo único.

Então você pode resolver perguntando dois parâmetros de modelo de tipo

// ...............................VVVVVVVVVVVV
template<class DataType, template<class, class> class Container>

ou, para ser mais flexível, uma lista variável de parâmetros de modelo de tipo

// ...............................VVVVVVVVV
template<class DataType, template<class ...> class Container>

Conforme apontado por HolyBlackCat (obrigado), seu código (portanto, um parâmetro de modelo de modelo solicitando um único parâmetro de modelo de tipo) deve falhar antes do C ++ 17, mas deve ser aceito a partir do C ++ 17 (as regras de correspondência são alteradas).

Infelizmente, isso funciona com g ++, mas não para clang ++: o desenvolvedor do clang ++ não implementa, por padrão, essa nova regra de correspondência C ++ 17.

Mas o relatório HolyBlackCat que também clang ++ aceitar seu código adicionando um parâmetro especial: -frelaxed-template-template-args.