Solution pour la déduction des arguments de modèle dans un contexte non déduite
-
25-10-2019 - |
Question
Considérez le code suivant:
#include <iostream>
template<class T>
struct outer {
struct inner {};
};
template<class T>
std::ostream& operator<<(std::ostream & stream,
typename outer<T>::inner const& value) {
std::cout << "An outer::inner!";
return stream;
}
int main() {
outer<float>::inner foo;
std::cout << foo << std::endl; // does not compile
}
Cela ne compile pas, parce que
La solution Vous pouvez déplacer l'opérateur dans le corps de classe interne et de mettre Une autre technique consiste à dériver interne à partir d'une base de CRTP paramétrée par interne. Faites ensuite le type de paramètre la classe CRTP et jeté le paramètre référence à la classe dérivée typename outer<T>::inner
est contexte nondeduced (comme expliqué ici ), ce qui signifie le type de modèle argument ne peut être déduit par le compilateur (lu
friend
devant lui. Remplacez ensuite le type de paramètre par juste inner
. inner
, dont le type est donnée par l'argument de modèle que vous déduisez.