【问题标题】:Cannot get rid of warning C4554无法摆脱警告 C4554
【发布时间】:2016-11-20 07:56:23
【问题描述】:

Visual Studio 2015 中编译时,此代码始终会产生 C4554 警告。但是,g++(在 Coliru 上)编译它时没有警告。警告信息是:

警告 C4554: '

根据this,运算符- 优先于运算符

#include <array>

template<int C>
void F(std::array<int, 2 << (C-1)> const&) // 2 << (2-1) = 4
{
}

int main()
{
    std::array<int,4> arr;
    F<2>(arr);
}

【问题讨论】:

  • 为什么要在参数声明中放置语句表达式?我很确定除了这个警告之外还有更多错误。
  • @πάνταῥεῖ :问题是,您如何让编译器充分满足以消除警告?代码的实用性尚无定论。
  • 应该没有必要,但template&lt;int C&gt; void F(std::array&lt;int, (2 &lt;&lt; (C-1))&gt; const&amp;) 有效吗?
  • 没有括号组合可以使警告静音,我也无法通过将#pragma warning(suppress: 4554) 放在上面的行中来消除它。当您编写混淆代码时会发生这些事情......警告只是为了提供帮助,它不是为像您这样聪明的程序员准备的。
  • @Cody Gray:嗯,这是一个 SSCCE。我不会认为实际功能是混淆代码。我发现了一种不完全等效的hackish解决方法,但会使警告静音。只需像这样移动编译时表达式:template&lt;int C, int K = 2 &lt;&lt; (C-1)&gt; void F(std::array&lt;int, K&gt; const&amp;)。我想,我应该提交一份 VC++ 错误报告,尽管它似乎不会引起太多关注。

标签: c++ c++11 visual-c++ visual-studio-2015


【解决方案1】:

你可以试试这个:

constexpr std::size_t calc_size(int param)
{
    return 2 << (param - 1);
}

template<int C>
void F(std::array<int, calc_size(C)> const&) // 2 << (2-1) = 4
{
} 

【讨论】:

  • 完美。对于早期的 C++ 版本,我想可以使用@Martin Ba 的方法:template&lt;int X&gt; struct CalcSize { static const int Y = 2 &lt;&lt; (X-1); }; template&lt;int C&gt; void F(std::array&lt;int, CalcSize&lt;C&gt;::Y &gt; const&amp;){}
【解决方案2】:

在 Visual Studio 2015 中,使用 #pragma warning( disable : C4554 ) 禁用指定的警告消息。但是,禁用警告消息并不明智。

更多文档在这里... https://msdn.microsoft.com/en-us/library/aa273936(v=vs.60).aspx

查看此链接以了解为什么会出现警告 C4554... https://msdn.microsoft.com/en-us/library/5d2e57c5.aspx

【讨论】:

  • (1) 此编译指示适用于 所有 版本的 Visual Studio,而不仅仅是 VS 2015,因此不需要限定符。 (2) 使用它时,您包含C 前缀,仅包含数字。 (3)全局 禁用错误,这几乎可以肯定是个坏主意。如果您想这样做,您只需在命令行上禁用它,而不是在某个源文件中随机添加一行代码。如果您要这样做,唯一的最低限度的理智方法将涉及 #pragma warning(push)#pragma warning(pop) 的组合
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多