C++中不完全类型语法与命名空间的相关技术问题
问题:在函数类型声明的不完全类型语法中指定目标命名空间?
在C++代码中,我在命名空间s内使用不完全类型语法声明了一个函数类型,但其中的struct unknown_type会被绑定到当前命名空间作用域,也就是它的全限定名被视为::s::unknown_type。
下面这段代码可以正常编译运行:
namespace s { using callback = void(struct unknown_type); struct unknown_type {}; } void f(s::unknown_type) {} int main() { s::callback* cb = f; (void)cb; return 0; }
但这段代码无法编译:
namespace s { using callback = void(struct unknown_type); } struct unknown_type {}; void f(unknown_type) {} int main() { s::callback* cb = f; (void)cb; return 0; }
我知道用常规的前置声明方式能解决问题,但对这种特殊语法很好奇。我试过写using callback = void(struct ::unknown_type)但没用,想问能不能通过这种不完全类型语法前置声明时,指定目标命名空间?
答案:不能用这种语法指定目标命名空间
这种在函数参数列表里写struct unknown_type的写法,本质是在当前作用域下隐式声明一个类类型——如果该类型此前未被声明,编译器会自动在当前命名空间内创建它的不完全类型。这种隐式声明的作用域是固定的,C++语法本身不支持通过在struct前加::来指定其他命名空间,所以你试的那种写法会直接报错。
如果想让命名空间s中的函数类型引用全局命名空间的unknown_type,必须先在全局作用域前置声明该类型,然后在s中使用全限定名来定义函数类型,不能依赖这种隐式声明的方式。比如改成下面这样就能正常编译:
// 全局前置声明目标类型 struct unknown_type; namespace s { using callback = void(::unknown_type); } struct unknown_type {}; void f(unknown_type) {} int main() { s::callback* cb = f; (void)cb; return 0; }
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

