不久前,有人问这个question,关于熟悉的
error: 'static' can only be specified inside the class definition
错误。
在我当前的用例中,我正在从一个非常MSVC的项目转移,该项目中几乎所有代码都是使用MSVC进行编译的,并且是针对Android的交叉编译。
我注意到,关于静态类方法在类内部(外部)没有定义,没有MSVC错误,最重要的是没有警告。我想念什么吗?为什么至少没有警告?
编辑
为澄清起见,我要问为什么对于这样的代码没有正确的MSVC / MSVS警告(来自上面的链接):
class Foobar {
public:
static void do_something();
};
static void Foobar::do_something() {} // Error!
int main() {
Foobar::do_something();
}
编辑
对不起,我们一个!该示例无效!我很抱歉。
class Foobar {
public:
template<class Y>
static int do_something();
};
template<class Y>
static int Foobar::do_something() {return 1;} // Error!
int main() {
return Foobar::do_something<double>();
}
这是MSVC 19.14(成功)和GCC 4.12(失败)的输出。
答案 0 :(得分:2)
VS 2012 Update 5,VS 2013 Update 5,VS 2015 Update 3和VS 2017(15.9更新)均报告此代码错误:
error C2724: 'Foobar::do_something': 'static' should not be used
on member functions defined at file scope
我猜这是仅由旧的,不符合规范的Visual C ++版本构建的代码。
请注意,如果要使用Visual C ++编译器清理代码以使其更容易移植到其他平台,则:
您可以将VS 2017与/permissive-
开关一起使用。参见this blog post。
也可以尝试许多一致性开关,例如/Zc:__cplusplus
。参见this blog post。
使用
/permissive-
已经暗示/Zc:strictStrings
,/Zc:rvalueCast
和/Zc:ternary
并启用了two-phase name look-up。
您也可以使用/Wall
,尽管要花些力气才能降低所有杂音以查看有用的警告。它仍然不像clang
那样繁琐,但是很有帮助。有关要压缩的内容的示例,请参见this header的顶部。
还有一个实验性的C99预处理器,您可以尝试,尽管它仍处于早期阶段。参见this blog post
您可以使用VS 2017 Community Edition自己尝试一下。