2011-06-26 113 views
4

還有就是以下代碼:未命名的名稱空間

#include <iostream> 

using namespace std; 

namespace 
{ 
    int funkcja() 
    { 
     cout << "unnamed" << endl; 
     return 0; 
    } 
} 

int funkcja() 
{ 
    cout << "global" << endl; 
    return 0; 
} 

int main() 
{ 
    ::funkcja(); //this works, it will call funkcja() from global scope 
    funkcja(); //this generates an error 
    return 0;  
} 

我用克++。在這種情況下有沒有辦法從未命名的命名空間調用函數?可以使用:: function從全局範圍調用函數,但是如何從未命名的名稱空間調用函數?編譯器產生一個錯誤:

prog3.cpp: In function ‘int main()’: 
prog3.cpp:43:17: error: call of overloaded ‘funkcja()’ is ambiguous 
prog3.cpp:32:5: note: candidates are: int funkcja() 
prog3.cpp:25:6: note:     int<unnamed>::funkcja() 

回答

2

在這種情況下,有沒有方法可以從未命名的命名空間調用函數?
不,你的情況不是。

匿名/未命名空間允許變量和函數到整個翻譯單元內是可見的,但外部不可見。儘管未命名名稱空間中的實體可能具有外部鏈接,但它們通過其翻譯單元唯一的名稱進行有效限定,因此永遠無法從其他任何翻譯單元中看到。

這意味着您的函數funkcja內部的未命名名稱空間在定義全局函數funkcja的翻譯單元中可見。這會導致在全局範圍中定義兩個相同的命名函數,從而導致重新定義錯誤。

如果funkcja只存在於您的UnNamed名稱空間中,那麼您將能夠在::funkcja中調用它,因爲它將在您的全局範圍內。總之,您可以根據UnNamed Namespace所在的範圍調用UnNamed Namespace中的函數。

4

匿名命名空間的工作是,彷彿using namespace name_of_anonymous_namespace;已經下達內部宣佈他們的名字會自動顯示在封閉範圍的方式。

因此,在您的示例中,名稱funkcja是含糊不清的[new word!]。看起來你並不是真的想要一個匿名的命名空間,你真的需要一個正確命名的命名空間。

相關問題