2012-02-05 106 views
3

考慮下面的代碼中定義的函數:C++:實現匿名結構

class Named { 
    class /*Unnamed*/ { 
    void Function(); 
    } un; 
}; 

// Implement Named::Unnamed::Function here 

int main() { 
    Named named; 
    named.un.Function(); 
} 

有什麼辦法來實現命名::無名::功能,無需任何命名尚未命名或定義中嵌入函數的定義命名?

我猜答案是「否」,但GCC給了我有用的消息「未定義的引用到'命名:: {未命名類型#2} :: Function()',它發生在我身上可能有有一些瘋狂的可能語法

+1

您是否看到http://stackoverflow.com/questions/991062/passing-unnamed-classes-through-functions? – whitelionV 2012-02-05 01:31:21

+2

不會有「一些瘋狂的語法」。顯然,編譯器會爲每個實體分配一些名稱,但這些名稱是不可知或不可用的。我想說一個特別的定義需要一個函數的名字(除了構造函數),並且由於你不能命名這個函數,所以你不能對它進行特別的定義。 – 2012-02-05 01:39:03

+0

@whitelion:我沒有,但這與問題無關。是的,在這個問題上肯定有很多方法可以解決問題 - 我的意思是,最明顯的一個就是命名該類 - 我只是好奇是否有辦法避免這種解決方法。 – ZorbaTHut 2012-02-05 01:40:04

回答

11

這實際上是可能的(在C++ 11),並在兩個方面:

struct Named { 
    struct /*Unnamed*/ { 
    void Function(); 
    } un; 
    typedef decltype(un) Unnamed; 
}; 

// #1 
void Named::Unnamed::Function(){ 
} 

//// #2 
//typedef decltype(Named::un) Unnamed; 
//void Unnamed::Function(){ 
//} 
//// same way, using template alias 
//template<class T> using alias = T; 
//void alias<decltype(Unnamed::un)>::Function(){ 
//} 

int main() { 
    Named named; 
    named.un.Function(); 
} 

Live example on Ideone.

這可能是由於$9.1 [class.name] p5

A typedef-name(7.1.3)名稱類別類別或其cv限定版本也是類別名稱

+0

優雅!不是我會想到的方法。不幸的是,我沒有使用支持C++ 11的編譯器,但您絕對應該得到這個解決方案的讚譽:) – ZorbaTHut 2012-02-05 18:33:14