如何在a_t作用域内定义a_t::b_t::f成员函数?
在a_t作用域内定义a_t::b_t::f的可行方案
问题代码
struct a_t { struct not_yet_known_t; struct b_t { void f(not_yet_known_t* m); }; struct c_t { b_t b; //... }; struct not_yet_known_t { c_t c; //... }; // 错误位置 void b_t::f(not_yet_known_t* m) { // code comes here } }; int main() { a_t::not_yet_known_t m; a_t::b_t b; b.f(&m); }
编译错误
main.cpp:16:13: error: non-friend class member 'f' cannot have a qualified name void b_t::f(not_yet_known_t* m) { ~~~~~^
问题解答
1. 能否在a_t::作用域内定义a_t::b_t::f?
不行。C++语法明确禁止在包含类(a_t)的作用域内,用嵌套类(b_t)的限定名来定义其成员函数。你既不能用b_t::f的写法,也不能直接写f(这会被当成a_t自身的成员函数)。
唯一合法的定义方式有两种:
- 要么在
b_t的定义体内直接实现f(注意此时not_yet_known_t仅为前向声明,如果函数体需要访问该类型的成员会报错;仅做指针操作的代码可正常编写):struct b_t { void f(not_yet_known_t* m) { // 仅指针相关操作可放在这里 } }; - 要么将
f的定义移到a_t的作用域之外,使用完整限定名:struct a_t { // 内部结构保持不变 }; void a_t::b_t::f(a_t::not_yet_known_t* m) { // 此处可正常编写代码,not_yet_known_t已完整定义 }
2. 能否在a_t::作用域内访问全局作用域,且不移出代码?
可以。在a_t的任何成员函数(包括嵌套类的成员函数)中,只要用全局作用域解析符::作为前缀,就能直接访问全局作用域的实体。比如:
struct a_t { void some_func() { ::global_var = 10; // 访问全局变量global_var ::global_func(); // 调用全局函数global_func } };
但这无法解决前面定义b_t::f的语法限制,二者是独立的问题。
内容的提问来源于stack exchange,提问作者pesuww
相关产品推荐
相关产品推荐

