Problem mit dem Vorlagenvorlagenparameter in der Funktionsvorlage
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'.
- Kandidatenvorlage ignoriert: ungültiges explizit angegebenes Argument für Vorlagenparameter 'Container' "
Kann mir jemand helfen?
Antworten
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.