Как использовать функцию друга, когда класс написан внутри пространства имен - PullRequest
0 голосов
/ 04 февраля 2012

Я создал класс внутри пространства имен, теперь проблема возникает, когда мне придется использовать или вызвать пространство имен. Что может быть причиной ошибки компилятора?

namespace name1    
{   
        class show   
    {   
        int a,b;   
        void accept_data(void);   
        void display_data(void);   
        friend void use_class(void);  
    };  
}

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

test1.cpp: В функции 'void use_class ()':
test1.cpp: 17: 6: ошибка: 'void name1 :: show:: accept_data () 'является приватным
test1.cpp: 31: 16: ошибка: в этом контексте
test1.cpp: 24: 6: ошибка:' void name1 :: show :: display_data () 'isprivate
test1.cpp: 32: 17: ошибка: в этом контексте

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Когда вы объявляете функцию друга с помощью неквалифицированного идентификатора (например, use_class), в этом объявлении всегда указывается член ближайшего окружающего пространства имен класса, в котором оно появляется. Предыдущее объявление функции не должно быть видимым. Это означает, что ваше объявление объявляет функцию void ::name1::use_class() другом класса ::name1::show.

Если вы хотите объявить друга из другого пространства имен, вы должны использовать квалифицированный идентификатор.

1008 * Е.Г. *

friend void ::use_class();

Обратите внимание, что в отличие от неквалифицированного случая, предыдущее объявление функции, с которой нужно установить связь, должно быть видимым. например,

void use_class();
namespace name1 {
    class show {
    //...
    friend void ::use_class();
    //...
    };
}
0 голосов
/ 04 февраля 2012

Вы можете иметь это:

namespace name1    
{   
        class show   
    {   
        int a,b;   
        void accept_data(void);   
        void display_data(void);   
        friend void use_class(show&);  
    };  
}

void name1::use_class(name1::show& h)
{
h.a = 1;
h.b = 2;
}

и в основном:

name1::show s;

name1::use_class(s);

Я не уверен, почему ваши функции имеют пустые параметры и возвращаемые значения.

ОБНОВЛЕНИЕ:

это компилируется и работает:

#include "stdafx.h"

namespace name1    
{   
        class show   
    {   
        int a,b;   
        void accept_data(void);   
        void display_data(void);   
        friend void use_class();  
    };  
}

void name1::show::accept_data()
{
    a = 1;
    b = 2;
}

void name1::show::display_data()
{
}

void name1::use_class()
{
    show s;

    s.accept_data();
    s.display_data();
}

int _tmain(int argc, _TCHAR* argv[])
{
    name1::use_class();

    return 0;
}

Но, если я напишу это так:

void use_class()
{
    name1::show s;

    s.accept_data();
    s.display_data();
}

Я получу вашу ошибку.Убедитесь, что ваш use_class является частью того же пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...