C 兼容性语法破解
以下:
void f() {}
void g(void) {}
f();
g();
编译只是因为出于 C 兼容性原因而保留的有问题的 C++ 语法符号,即void
in g:
void g(void) {}
这里用来说“无参数”,而不是可以预期的“一个类型的参数void
”(这没有意义)。
在 C++ 中,我们有时需要包含 C 头文件,因此如果不支持这种表示法,就会出现问题。但这并不意味着您必须在 C++ 代码中使用它。
C++ 模板
当您声明:
template<typename T>
void g(T) {}
您正在声明一个g
以 type 为模板的函数T
,该函数有一个类型为 T 的未命名参数。
所以,当T
是void
,你仍在处理一个函数g
,它有一个类型为 的未命名参数void
。这没有任何意义。这意味着编译器会抱怨。
解决方案?
严重地?
根本不要使用g(void)
符号。这就像 C++ 中的 typedef-ing 结构。它没有用,只会混淆代码。
解决方案2?
现在,如果你真的有以下代码:
template<typename T>
void g(T) {}
如果你想提供一个g()
实现,你应该提供一个重载:
// Original template
template<typename T>
void g(T) { /* implementation for the generic case */ }
// Code to handle g()
void g() { /* implementation for the specific "void" case */ }
如果你想提供一个g<void>()
实现,你应该提供一个模板化的重载,通过特化处理 void 情况:
// Original template
template<typename T>
void g(T) { /* implementation for the generic case for g(T) */ }
// Code to handle g<void>()
template<typename T>
void g() { /* implementation for the generic case for g() */ }
template<>
void g<void>() { /* implementation for the generic case for g<void>() */ }