странное поведение с функциями-друзьями - область видимости "глобализирована", когда указатель объекта передан - PullRequest
0 голосов
/ 13 апреля 2011

Допустим, у меня есть заголовочный файл ах и исходный файл a.cpp.Когда я пытаюсь скомпилировать это и вызвать what () из другого файла (например, main.cpp), который включает в себя ах:


ах:

class A {  
friend void what();  
public:  
    int index;  
};

a.cpp:

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

void what() {  
    std::cout << "what" << std::endl;  
}

Сбой, как и ожидалось (ошибка: «что» не было объявлено в этой области).Однако, когда я делаю то же самое с этим:


ах:

class A {  
friend void what(A *thing);  
public:  
    int index;  
};

a.cpp:

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

void what(A *thing) {  
    std::cout << thing->index << std::endl;  
}

Он компилируется и прекрасно работает на g ++ 4.4.1 (конечно, при условии, что "index" инициализирован).Я не очень разбираюсь в C ++, но я предполагаю, что, передав указатель объекта в функцию, функция каким-то образом стала доступной для глобальной области видимости (то есть получила «повышение» для того, чтобы иметь возможность «видеть» объект).который ранее существовал в той же области, что и он).Я еще не пробовал это с другими видами функций, но, используя g ++ и дружественные функции, я получаю такое поведение.Это должно произойти в C ++?

Спасибо и извините, если это нубистский вопрос, мой друг Google меня подводил.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Я скомпилировал ваш код с g ++ 4.5.1, и об ошибках не сообщалось.

0 голосов
/ 13 апреля 2011

Я думаю, что вы забыли ; в конце объявления вашего класса.

Следующий код прекрасно работает для меня (gcc 4.4.5)

хиджры

class A {
friend void what();
private:
    int index;
};

a.cpp

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

using namespace std;

void what()
{
    cout << "what" << endl;
}

int main()
{
        what();
        return 0;
}

UPDATE

Вы должны объявить функцию what в заголовочном файле a.h до A объявления класса.

...