2016-01-04 6 views
3

je une classe nommée « carte » et une classe nommée « CardDeck », avec la promotion suivante définie dans « CardDeck.h »:opérateur + ne fonctionne pas lorsque les deux paramètres doivent être promus

CardDeck(Card card){cards.push_back(card);} 

CardDeck a un opérateur ami +:

friend CardDeck operator+(const CardDeck, const CardDeck); 

qui fonctionne très bien pour:

CardDeck+CardDeck 
CardDeck+Card 
Card+CardDeck 

mais il ne fonctionnera pas pour carte + Carte Je reçois:

"no match for 'operator+' (operand types are 'Card' and 'Card')" 

Pourquoi ne sont pas les cartes étant promu dans ce cas, les styles de cartes? J'ai aussi essayé opérateur majeur + avec:

friend CardDeck operator+(const Card, const Card); 

mais cela ne fonctionne pas non plus. aucun indice pourquoi?

Merci!

+5

Généralement, vous passez 'const CardDeck &', c'est-à-dire des références const à 'operator +'. – PaulMcKenzie

+0

Je ne pense pas que ce soit le problème ici. Pourriez-vous nous montrer la dernière définition d'opérateur? – xinaiz

+0

Comment le compilateur est supposé savoir que vous voulez un 'CardDeck' de 2' Deck's? Que faire s'il y a plus de classes qui exposent aussi les constructeurs pour 'Card'? Ce serait ambigieux. –

Répondre

0

s'avère @PaulMcKenzie avait la réponse (malheureusement je ne peux pas marquer son commentaire comme une solution): L'opérateur a été défini à l'intérieur de la classe, donc il n'était pas disponible pour 'Card'. Pour une raison quelconque, je pensais que l'implémenter dans le fichier source suffirait pour qu'il soit connu des étrangers, mais ce n'est évidemment pas vrai car les étrangers ne savent rien du fichier source. le code fourni par Paul montre la solution:

http://ideone.com/lkr5ME

Merci Paul!

a 
3

Fonctionne pour moi bien!

class A 
{ 
    public: 
    A() {} 
}; 

class B 
{ 
public: 
    B(A sth) {} 
}; 

B operator+(const B x, const B y) 
{ 
    return B(A()); 
} 

using namespace std; 

int main() 
{ 
    A x; 
    B y(x); 
    y + y; 
    x + y; 
    y + x; 
    x + x; 
    return 0; 
} 

Aucune erreur n'attend les paramètres et les expressions inutilisés.

+0

@shayelk quelle ligne voulez-vous dire? – xinaiz

+0

désolé, le commentaire a été envoyé par erreur :) – shayelk

1

Je pense que Black Moses a partiellement raison. Il semble que vous déclariez l'implémentation de l'opérateur dans la classe avec le mot clé friend. Cela crée le vous erreur de compilation parler, dire qu'il semble que vous procédez comme suit:

class B 
{ 
    public: 
    B(A sth) { ... } 

    friend int operator+(const B x, const B Y) 
    { 
     return 0; 
    } 

}; 

Si vous utilisez ce que Black Moses a fait dans son exemple, et ajoutez ce qui suit à votre classe:

friend int operator+(const B x, const B y); 

alors l'erreur de compilation disparaît. Pour résumer: déclarer l'opérateur une fonction ami dans votre définition de classe, puis déclarer la mise en œuvre en dehors de la classe, comme ceci:

int operator+(const B x, const B y) 
{ 
    return 0; 
} 

Hope this helps.

+0

opérateur + est défini comme un ami dans la classe, et est implémenté dans le fichier source, comme vous le suggérez. ne fonctionne toujours pas ... le thig étrange est que je ne peux même pas obtenir une version surchargée qui prend deux cartes à travailler. – shayelk