J'ai une classe de modèle qui définit un sous-type. J'essaie de définir le binaire operator+
en tant que fonction de modèle, mais le compilateur ne peut pas résoudre la version du modèle du operator+
.Opérateur + pour un sous-type d'une classe de modèle
#include <iostream>
template<typename other_type>
struct c {
c(other_type v) : cs(v) {}
struct subtype { subtype(other_type v) : val(v) {} other_type val; } cs;
};
template<typename other_type>
typename c<other_type>::subtype operator+(const typename c<other_type>::subtype& left,
const typename c<other_type>::subtype& right)
{ return typename c<other_type>::subtype(left.val + right.val); }
// This one works
// c<int>::subtype operator+(const c<int>::subtype& left,
// const c<int>::subtype& right)
// { return c<int>::subtype(left.val + right.val); }
int main()
{
c<int> c1 = 1;
c<int> c2 = 2;
c<int>::subtype cs3 = c1.cs + c2.cs;
std::cerr << cs3.val << std::endl;
}
Je pense que la raison est parce que le compilateur (g ++ 4.3) ne peut pas deviner le type de modèle il est donc la recherche de operator+<int>
au lieu de operator+
.
Pour quelle raison? Quelle solution élégante pouvez-vous suggérer?
La raison est que vous avez nondeduced contexte ici selon C++ standard 14.8.2.4/4. –