c++ - 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(失败)的输出。
解决方案
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++ 编译器清理代码以使其更容易移植到其他平台:
使用
/permissive-
already 意味着/Zc:strictStrings
,/Zc:rvalueCast
和/Zc:ternary
and 启用两阶段名称查找。
您也可以使用
/Wall
,尽管需要付出一些努力才能消除所有噪音才能看到有用的警告。它仍然没有那么繁琐clang
,但它很有帮助。有关要抑制的一堆内容的示例,请参见此标题的顶部。您还可以尝试一个实验性的 C99 预处理器,尽管它仍处于早期阶段。请参阅此博客文章
您可以使用 VS 2017 社区版自己尝试一下。
推荐阅读
- r - 随着时间的推移保留前 n% 的数据
- swift - 如何在 Core Data 中保存实体的多个“实例”?
- python - Python3 - 将复杂的字符串转换为列表/字典
- javascript - 从 iframe 打开新窗口时 Cookie 不保留
- flutter - 从数据库显示颤振图
- amazon-web-services - Docker Build 在 AWS EKS 的工作节点中不起作用
- javascript - 如何在 Google Analytics 的事件报告中识别和修复“未设置”事件标签的原因?
- css - 背景图像无法正确显示
- javascript - 事件未在本地 url 上触发,url 需要具体吗?
- lsh - 基于 LSH 等技术的语义文本相似性搜索与基于分布式语义的嵌入技术有何不同?