【问题标题】:MSVS/MSVC Static Template Class Method Does Not WarnMSVS/MSVC 静态模板类方法不警告
【发布时间】:2018-11-16 17:53:03
【问题描述】:

前阵子有人问这个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(失败)的输出。

【问题讨论】:

  • 我们需要一个minimal reproducible example,您会在其中收到警告。
  • 在类之外有静态函数定义是完全可以(并且正常)的 - 但在这种情况下你不能将它们标记为static
  • 从外部定义中删除 static 关键字?我不清楚你想在这里问什么
  • @tkausl 帖子的超链接中提供了一个这样的例子。

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


【解决方案1】:

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 社区版自行试用。

【讨论】:

  • @ChristianHackl 我的大错误。请查看编辑。
  • 这就是为什么我半小时前询问了你的代码的剪辑/MCVE,而不仅仅是任何代码。
  • /Wall 完全没用,因为它与标准 C++ 头文件不兼容。但是,使用 /W4 编译是个好主意。
  • @ChristianHackl - Wall 打开一堆默认关闭的东西,如果你花时间让所有不是的东西静音,这很有用......我用它来做我的各种 GitHub 项目,虽然我同意这是很多工作。另见this blog post
  • @ChuckWalbourn:我不知道...如果我只包含&lt;iostream&gt;,甚至没有使用标题中的任何内容,我会收到几页警告。也许最有效的方法是在项目的标准配置中使用/W4 进行编译,并且每隔一段时间检查一次/Wall 结果,以避免浪费时间和资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多