Problem mit dem Vorlagenvorlagenparameter in der Funktionsvorlage

Nov 08 2020

Ich versuche, einen Vorlagenvorlagenparameter zu verwenden, und mein Code wird nicht kompatibel sein.

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);
}

Die Fehlermeldung lautet "Keine Übereinstimmungsfunktion für den Aufruf von 'foo'.

  1. Kandidatenvorlage ignoriert: ungültiges explizit angegebenes Argument für Vorlagenparameter 'Container' "

Kann mir jemand helfen?

Antworten

2 max66 Nov 08 2020 at 12:25

Vorschlag: versuchen Sie es mit

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

Das Problem ist, dass zwei Typvorlagenparameter std::vectorakzeptiert werden. der zweite mit einem Standardwert.

Wenn du schreibst

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

Sie fragen nach einem Template-Template-Parameter, der einen Template-Parameter eines einzelnen Typs akzeptiert.

Sie können also die Frage nach zwei Typvorlagenparametern lösen

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

oder, um flexibler zu sein, eine variable Liste von Typvorlagenparametern

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

Wie von HolyBlackCat (danke) angegeben, sollte Ihr Code (also ein Template-Template-Parameter, der nach einem Template-Parameter eines einzelnen Typs fragt) vor C ++ 17 fehlschlagen, aber ab C ++ 17 akzeptiert werden (die Übereinstimmungsregeln werden geändert).

Leider funktioniert dies mit g ++, aber nicht mit clang ++: Der Entwickler von clang ++ implementiert diese neue C ++ 17-Übereinstimmungsregel standardmäßig nicht.

Aber HolyBlackCat-Berichte, die auch clang ++ akzeptieren, akzeptieren Ihren Code und fügen einen speziellen Parameter hinzu : -frelaxed-template-template-args.