ultima descargar compiler compilador c++ templates g++ c++14 c++17

descargar - Ambigüedad de la deducción de la plantilla de g++ 8.1 con indicador estándar igual a ''c++ 17''



gcc ultima version (1)

El comportamiento cambió desde C ++ 17.

Antes de C ++ 17, el código funciona porque std::vector tiene dos parámetros de plantilla (el segundo tiene el argumento predeterminado std::allocator<T> ), mientras que el parámetro de plantilla de Vector se declara que tiene solo uno, no no coincide entonces la segunda func no será considerada.

Desde C ++ 17 ( CWG 150 ), los argumentos de plantilla predeterminados se permiten para que un argumento de plantilla de plantilla coincida con un parámetro de plantilla de plantilla con menos parámetros de plantilla. Eso significa que ambas func convierten en candidatos válidos y luego conduce a la ambigüedad.

template<class T> class A { /* ... */ }; template<class T, class U = T> class B { /* ... */ }; template<template<class> class P> class X { /* ... */ }; X<A> xa; // OK X<B> xb; // OK in C++17 after CWG 150 // Error earlier: not an exact match

Tengo un código que es interpretado de manera diferente por g ++ con las banderas estándar c++14 y c++17 :

#include <iostream> #include <vector> template<class T, class A> void func(const std::vector<T, A>&v) { std::cout << 1 << std::endl; } template<typename T, template <typename>class Vector> void func(const Vector<T>&v) { std::cout << 2 << std::endl; } void f() { std::vector<int> v; func(v); } int main() { f(); return 0; }

Cuando estoy tratando de compilar este código con comando

g ++ -std = c ++ 14 -Wall -pedantic main.cpp

todo funciona bien

Pero cuando estoy tratando de compilar este código con comando

g ++ -std = c ++ 17 -Wall -pedantic main.cpp

Me sale este error:

main.cpp: In function ''void f()'': main.cpp:19:11: error: call of overloaded ''func(std::vector<int>&)'' is ambiguous func(v); ^ main.cpp:5:6: note: candidate: ''void func(const std::vector<_Tp, _Alloc>&) [with T = int; A = std::allocator<int>]'' void func(const std::vector<T, A>&v) ^~~~ main.cpp:11:6: note: candidate: ''void func(const Vector<T>&) [with T = int; Vector = std::vector]'' void func(const Vector<T>&v)

No puedo entender qué está mal con este código desde el punto de vista del estándar C ++ 17.