Je travaille sur deux classes d'emballage qui définissent les types de données réelles et complexes. Chaque classe définit des constructeurs surchargés, ainsi que les quatre opérateurs arithmétiques +, -, *,/et cinq opérateurs d'assignation =, + = etc. Afin d'éviter de répéter le code, je pensais utiliser les fonctions gabarit quand la gauche et la droite arguments -hand-latérales d'un opérateur sont d'un type de données différent:surcharge Ambigu sur les opérateurs de modèle
// real.h
class Real {
public:
explicit Real(const double& argument) {...}
explicit Real(int argument) {...}
...
friend const operator*(const Real&; const Real&);
template <class T> friend const Real operator*(const Real&, const T&);
template <class T> friend const Real operator*(const T&, cont Real&);
// Here, T is meant to be a template parameter for double and int
// Repeat for all other arithmetic and assignment operators
};
// complex.h
class Complex {
public:
explicit Complex(const Real& realPart) {...}
explicit Complex(const Real& realPart, const Real& imaginaryPart) {...}
// Overload for double and int data types
...
friend const operator*(const Complex&, const Complex&);
template <class T> friend const Complex operator*(const Complex&, const T&);
template <class T> friend const Complex operator*(const T&, cont Complex&);
// Here, T is is a template parameter for Real, double and int
...
};
le problème ici est que le code comme:
//main.cpp
void main() {
Complex ac(2.0, 3.0);
Real br(2.0);
Complex cc = ac * br;
}
retourne le compilateur (gcc) erreur de surcharge ambiguë pour 'opérateur *' dans 'ac * br », comme le compilateur ne peut pas faire la différence entre:
template <class T> friend const Complex operator*(const Complex&, const T&)
[avec T = Real]template <class T> friend const Real operator*(const T&, cont Real&)
[avec T = Complexe]
est-il un moyen pour spécifier que T ne peut pas être un complexe dans l'opérateur de modèle * définition dans la classe Real? Ou dois-je faire sans modèles et définir chaque opérateur pour chaque combinaison possible de types de données d'argument? Ou y a-t-il un moyen de redéfinir le code?
Les constructeurs devraient en effet être rendus explicites (question éditée). Cependant, dans ce cas, les rendre explicites n'éliminent pas l'erreur de compilation. – ASV