2012-02-04 26 views
0

我已經在命名空間內創建了一個類現在問題發生在我將不得不使用或調用名稱空間時,可能是編譯器錯誤的可能原因?如何在名稱空間內寫入類時使用friend函數

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:錯誤:「無效NAME1 ::顯示:: accept_data() '是私人
test1.cpp:31:16:錯誤:在這一範圍內
test1.cpp:24:6:錯誤: '無效NAME1 ::顯示:: display_data()' 是私人
test1.cpp: 32:17:錯誤:在此範圍內

+0

'use_class'聲明在哪裏? – pmr 2012-02-04 15:23:45

+0

它是在外部命名空間 – 2012-02-04 15:24:52

+0

中聲明的,你需要告訴我們編譯器錯誤是什麼 – 2012-02-04 15:28:04

回答

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

「有無效的參數和返回值,雖然」安德烈你要傳達什麼? ??? – 2012-02-04 15:35:17

+0

@System_Coder:通過'void accept_data(void);'接受哪些數據如果參數是無效的?您的內部使用cin/cout的接受/顯示功能是?你的'use_class',如果它的參數是無效的,它使用什麼樣的'show'實例?你在'use_class'裏面創建'show'的實例嗎?你想做什麼,因爲可能有更好的方法來做到這一點。 – Andrei 2012-02-04 15:42:56

+0

我會在use_class中創建show的實例,當然還有更好的方法可以做到這一點,但爲什麼會發生這種情況是我想知道的 – 2012-02-04 15:46:56

3

當您使用非限定標識符(如use_class)聲明好友函數時,該聲明始終指定聲明出現的類的最近的封閉名稱空間的成員。先前的函數聲明不一定是可見的。這意味着您的聲明宣佈函數void ::name1::use_class()是類::name1::show的朋友。

如果要從不同的名稱空間聲明朋友,則必須使用合格的ID。

E.g.

friend void ::use_class(); 

請注意,與不合格的情況不同,此函數的前一個聲明必須是可見的。例如

void use_class(); 
namespace name1 { 
    class show { 
    //... 
    friend void ::use_class(); 
    //... 
    }; 
} 
相關問題