Pregunta ¿Por qué el orden de los parámetros de la plantilla es importante para el compilador MS C ++ en este ejemplo?


El siguiente código compila bien en GCC, pero en Visual Studio resulta en

error C2782: 'bool contains(const T &,const std::initializer_list<T2> &)': parámetro de plantilla'T'es ambiguo ver declaración de   'contains' podría ser 'const wchar_t *'o'std::wstring'

Sin embargo compila y funciona si el orden de los parámetros de la plantilla se da como

template<typename T2, typename T>

¿Es esto un error del compilador?

#include <string>
#include <iostream>
#include <set>
#include <initializer_list>
#include <algorithm>

template<typename T, typename T2>
bool contains(T const& value, std::initializer_list<T2> const& set)
{
  return std::find(std::begin(set), std::end(set), value) != std::end(set);
}

int main(void)
{
  std::set<std::wstring> values = { L"bar", L"not" };

  for (std::wstring val : values) {
    std::wcout << "\"" << val << "\" ";
    if (contains(val, { L"foo", L"bar", L"baz", L"doom" })) {
      std::wcout << "found" << std::endl;
    }
    else {
      std::wcout << "not found" << std::endl;
    }
  }
}

Editar: he creado un informe de error: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/982338/template-parameter-order-matters


28
2017-09-26 13:06


origen


Respuestas:


Recuerdo que VS tiene un error en el que harían doble deducción en ciertos escenarios, y creo que eso es lo que está sucediendo aquí. Clang también lo compila en ambos sentidos, por lo que, dado que clang + gcc está de acuerdo, es probable que sea un error de VS.


1
2017-09-28 23:44



Tuve un problema similar que se resolvió al cambiar a la última versión de VS Pro. Creo que este error fue abordado en la última versión VS pro ya que recuerdo haberlo visto en un registro de cambios en algún momento.


1
2017-10-03 15:55