2012-02-04 4 views
0

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

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

компилятора Ошибки -

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

+0

Где объявляется 'use_class'? – pmr

+0

Объявлено вне пространства имен –

+0

вам нужно сообщить нам, что ошибка компилятора –

ответ

0

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

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

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

UPDATE:

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

#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 является частью того же пространства имен.

+0

«имеют параметры void и возвращают значения». Андрей. Что вы хотите передать этим? ??? –

+0

@System_Coder: какие данные принимаются через 'void accept_data (void);' если параметр недействителен? Используется ли функция accept/display с помощью cin/cout внутри? Ваш «use_class», какой экземпляр «show» используется, если его параметр недействителен? Создаете ли вы экземпляр «show» внутри «use_class»? Что вы пытаетесь сделать, поскольку, вероятно, есть лучшие способы сделать это. – Andrei

+0

Я бы создал экземпляр show в use_class и, конечно, есть лучшие способы сделать это, но почему это происходит, что я хочу знать –

3

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

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

E.g.

friend void ::use_class(); 

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

void use_class(); 
namespace name1 { 
    class show { 
    //... 
    friend void ::use_class(); 
    //... 
    }; 
} 
Смежные вопросы