Функции друзей не распознаны - PullRequest
0 голосов
/ 12 сентября 2010

У меня есть следующий класс с парой функций-друзей:

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); 

Когда я помещаю последнюю функцию в качестве функции-друга внутри класса следующим образом:

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

Кодвыдает дополнительную ошибку overlapT was not declared in this scope в main.cpp.Что касается других функций перекрытия (которые перегружены в других файлах), я получаю похожие ошибки, когда они являются дружественными функциями в классе: error: no matching function for call to 'overlap()'.Я использовал функции друзей в том же порядке, что и в другом файле, и не обнаружил ошибок компиляции.Что может быть причиной этой странной ошибки?

Хорошо, есть небольшая программа, которая иллюстрирует эту ошибку!

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();
}

Ошибки компиляции:

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

Я подозреваю, что статические переменные могут иметь какое-то отношение к этому, так как мои другие классы без статических переменных работают простохорошо.

РЕДАКТИРОВАТЬ: На самом деле, кажется, что статические переменные не являются проблемой.Я просто удалил ключевое слово static из определения класса Teleport / как оно называется? И прокомментировал bool Teleport::veracity;;тем не менее, я все еще получаю две ошибки

1 Ответ

1 голос
/ 12 сентября 2010

хочешь возможно?

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

затем

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

bool isNotTrue(); // dont forget args
bool isTrue();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...