2010-09-12 5 views
0

J'ai la classe suivante avec des fonctions amies couple:fonctions ami non reconnu

class Teleport 
{ 
public: 
    Teleport(); 
    ~Teleport(); 
    void display(); 
    Location teleportFrom(int direction); 

    friend bool overlap(Wall * wall, Teleport * teleport); 
    friend bool overlap(Location location); 
    friend bool overlap(Wall * wall); 
    friend bool overlap(); 

    Location location; 
    static vector<Teleport *> teleports; 
private: 

    int currentTeleport; 
}; 

bool overlapT(vector<Wall *> walls); 

Quand je mets la dernière fonction en fonction ami dans la classe comme ceci:

class Teleport 
{ 
public: 
    //...same functions as before... 
    friend bool overlapT(vector<Wall *> walls); 
    //... same functions as before... 
private: 
    //... same functions as before... 
} 

Le code produit une erreur supplémentaire overlapT was not declared in this scope dans main.cpp. Comme pour les autres fonctions de chevauchement (qui sont surchargées dans d'autres fichiers), j'obtiens des erreurs similaires quand elles sont des fonctions d'amis dans la classe: error: no matching function for call to 'overlap()'. J'ai utilisé des fonctions d'ami dans ce que je crois être la même manière dans un autre dossier, et n'ai aucune erreur de compilateur. Qu'est-ce qui pourrait causer cette étrange erreur?

Bon, j'ai un petit programme qui illustre cette erreur!

main.cpp

#include <iostream> 
#include "Teleport.h" 

using namespace std; 

int main() 
{ 
    Teleport teleport; 
    isTrue(); 
    isNotTrue(); 
    isTrue(1); 
    return 0; 
} 

Teleport.h

#ifndef TELEPORT_H 
#define TELEPORT_H 


class Teleport 
{ 
public: 
    Teleport(); 
    virtual ~Teleport(); 
    friend bool isTrue(); 
    friend bool isNotTrue(); 
private: 
    bool veracity; 
}; 

bool isTrue(int a); //useless param, just there to see if anything happens 

#endif // TELEPORT_H 

teleport.cpp

#include "Teleport.h" 

//bool Teleport::veracity; 

Teleport::Teleport() 
{ 
    veracity = true; 
} 

Teleport::~Teleport() 
{ 
    //dtor 
} 

bool isTrue() 
{ 
    return Teleport::veracity; 
} 

bool isNotTrue() 
{ 
    return !Teleport::veracity; 
} 

bool isTrue(int a) 
{ 
    if(isTrue()) 
     return true; 
    else 
     return isNotTrue(); 
} 

des erreurs de compilation:

error: too few arguments to function 'bool isTrue(int)' 
error: at this point in file 
error: 'isNotTrue' was not declared in this scope 

Je soupçonne que les variables statiques peuvent avoir quelque chose à voir avec cela, car mes autres classes sans variables statiques fonctionnent très bien.

EDIT: En fait, il semble que les variables statiques ne posent pas de problème. Je viens de supprimer le mot-clé static de la définition de classe Teleport/quel que soit son nom ?, et commenté bool Teleport::veracity;; néanmoins, je reçois toujours les deux erreurs

+0

Pouvez-vous poster un exemple complet (mais minime) qui reproduit le problème? Je soupçonne que cela pourrait être un problème d'espace de noms, mais il est impossible de dire ce qui se passe sans voir plus de code. –

+0

@aaa carpe - cela fonctionne pour 'overlapT()', si je le mets avant ou après la classe – wrongusername

+0

@Adam Rosenfield - Je peux essayer, mais juste pour que vous sachiez, je n'ai pas déclaré d'espaces de noms, et j'utilise seulement 'std' – wrongusername

Répondre

1

vous voulez peut-être?

class Teleport 
{ 
public: 
    Teleport(); 
    virtual ~Teleport(); 
    bool isTrue(); // Teleport.isTrue 
    bool isNotTrue(); // Teleport.isNotTrue 
    friend bool isTrue(); 
    friend bool isNotTrue(); 
private: 
    static bool veracity; 
}; 

puis

class Teleport 
{ 
public: 
    Teleport(); 
    virtual ~Teleport(); 
    friend bool isTrue(); 
    friend bool isNotTrue(); 
private: 
    bool veracity; 
}; 

bool isNotTrue(); // dont forget args 
bool isTrue(); 
+0

qu'est-ce que je mets dans les définitions de 'isTrue()' et 'isNotTrue()' alors?Je les veux en tant que fonctions ami, pas en tant que fonctions faisant partie de 'Teleport' – wrongusername

+0

alors est-ce que je crée une autre fonction' isTrue() '? et renvoie 'isTrue()' retour? alors je reçois 'redéfinition de 'bool isTrue()'' – wrongusername

+0

ok NVM ce commentaire lol ... maintenant je viens de mettre ces deux fonctions là, et ça marche !!! mais pourquoi? EDIT: et cette astuce fonctionne aussi avec mon programme original! Merci beaucoup! mais pourquoi dois-je mettre cela en dehors de la classe aussi? Je suis confus au sujet de cette partie – wrongusername