首页 > 解决方案 > MSVS/MSVC 静态模板类方法不警告

问题描述

前阵子有人问过这个问题,关于熟悉的

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(失败)的输出。

标签: c++visual-studiovisual-c++static

解决方案


VS 2012 Update 5, VS 2013 Update 5, VS 2015 Update 3 和 VS 2017 (15.9 update) 都报此代码错误:

error C2724: 'Foobar::do_something': 'static' should not be used
             on member functions defined at file scope

我猜测代码仅使用较旧的、不符合标准的 Visual C++ 版本构建。

请注意,如果您想使用 Visual C++ 编译器清理代码以使其更容易移植到其他平台:

  • 您可以将 VS 2017 与/permissive-交换机一起使用。请参阅此博客文章

  • 还有许多一致性开关可供尝试,例如/Zc:__cplusplus. 请参阅此博客文章

使用/permissive-already 意味着/Zc:strictStrings,/Zc:rvalueCast/Zc:ternaryand 启用两阶段名称查找

  • 您也可以使用/Wall,尽管需要付出一些努力才能消除所有噪音才能看到有用的警告。它仍然没有那么繁琐clang,但它很有帮助。有关要抑制的一堆内容的示例,请参见此标题的顶部。

  • 您还可以尝试一个实验性的 C99 预处理器,尽管它仍处于早期阶段。请参阅此博客文章

您可以使用 VS 2017 社区版自己尝试一下。


推荐阅读