给出以下代码:
class Named {
class /*Unnamed*/ {
void Function();
} un;
};
// Implement Named::Unnamed::Function here
int main() {
Named named;
named.un.Function();
}
有没有办法实现Named :: Unnamed :: Function而无需命名Unnamed或在Named的定义中嵌入函数的定义?
我猜答案是“不”,但是GCC给了我一个有用的信息“未定义引用`Named :: {unnamed type#2} :: Function()',它发生在我身上可能有一些疯狂的可能语法。
答案 0 :(得分:12)
这实际上是可能的(在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();
}
这要归功于$9.1 [class.name] p5
:
命名类类型或其cv限定版本的 typedef-name (7.1.3)也是类名。