Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 来自std::chrono但未使用的编译器警告_C++ - Fatal编程技术网

C++ 来自std::chrono但未使用的编译器警告

C++ 来自std::chrono但未使用的编译器警告,c++,C++,注意:此错误仅在版本和调试模式下的x64项目中出现 使用VC2019时,此代码上会出现涉及std::chrono的奇怪警告,警告级别为3。这是一段处理命令行标志的精简代码。我已经去掉了大部分与问题无关的内脏 #if 1 // enable bug #include <chrono> // excluding this also eliminates chrono warnings using CorrectedIntType=int; #else using Correcte

注意:此错误仅在版本和调试模式下的x64项目中出现

使用VC2019时,此代码上会出现涉及
std::chrono
的奇怪警告,警告级别为3。这是一段处理命令行标志的精简代码。我已经去掉了大部分与问题无关的内脏

#if 1   // enable bug
#include <chrono>   // excluding this also eliminates chrono warnings
using CorrectedIntType=int;
#else
using CorrectedIntType=size_t;
#endif

#include <iostream>
#include <vector>
#include <string>
#include <type_traits>

using std::vector;
using std::string;

namespace {
    void fixup(const std::string& argcmd, std::string& arg) { arg = argcmd; }

    template<class T>
    void procVal(std::vector<std::string>& arglist, CorrectedIntType idx, T& arg)
    {
        fixup(arglist[idx], arg);
        arglist.erase(arglist.begin() + idx);
    }

    template<class T, class ...TA>
    void procVal(std::vector<std::string>& arglist, CorrectedIntType idx, T& arg, TA&...argv)
    {
        procVal(arglist, idx, arg);
        procVal(arglist, idx, argv...);
    }

    template<class T, class ...TA>
    bool procFlag(const char* pc, std::vector<std::string>& arglist, T& arg1, TA&...argv)
    {
        std::string flag(pc);
        for (size_t i = 0; i < arglist.size(); i++)
        {
            if (arglist[i] == flag)
            {
                arglist.erase(arglist.begin() + i);
                procVal(arglist, i, arg1);      // process one argument after flag
                return true;
            }
        }
        return false;
    }
}

int main()
{
    string outfile;
    vector<string> test = { "test" };
    procFlag("-o", test, outfile);      // assigns test[0] to outfile and removes it
    std::cout << outfile << '\n';
}
#如果1//启用错误
#包括//不包括这也消除了计时警告
使用CorrectedIntType=int;
#否则
使用CorrectedIntType=大小\u t;
#恩迪夫
#包括
#包括
#包括
#包括
使用std::vector;
使用std::string;
名称空间{
void fixup(const std::string&argcmd,std::string&arg){arg=argcmd;}
模板
void procVal(std::vector和arglist,更正了类型idx、T和arg)
{
修正(arglist[idx],arg);
arglist.erase(arglist.begin()+idx);
}
模板
void procVal(std::vector&arglist,更正了类型idx、T&arg、TA&…argv)
{
procVal(arglist、idx、arg);
procVal(arglist、idx、argv…);
}
模板
bool procFlag(const char*pc、std::vector和arglist、T和arg1、TA和…argv)
{
std::字符串标志(pc);
对于(size_t i=0;i C:\Users\mgray\Documents\Visual Studio 2017\Projects\CommandLineCPP\stackoverflow\Source.cpp(54):消息:请参阅函数模板实例化“bool`anonymous namespace”::正在编译的procFlag(const char*,std::vector&,T&)
1> 与
1>        [
1> T=std::string
1>        ]
1> C:\Program Files(x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\include\chrono(632):消息:请参阅正在编译的类模板实例化“std::chrono::duration”的参考
1> C:\Program Files(x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\include\chrono(178):消息:请参阅正在编译的类模板实例化“std::chrono::duration”的参考
1> C:\Program Files(x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\include\chrono(610):消息:请参阅正在编译的类模板实例化“std::chrono::time_point”的参考

当代码工作时,即使有合法警告的
int-size\u t
转换问题,当顶部的宏设置为0时,所有警告都会消失。因此,size\u t和int之间的大小差异会触发计时消息。我担心
chrono
警告存在,因为它不涉及。这是一个bu吗VS2019中的g?关于为什么会出现
chrono
警告引用,有什么想法吗?

您可能使用的是旧版本VS中的Windows SDK吗?如果是,那里的STL标头可能与“严格性”不兼容和VS2019项目的语言标准设置。@AdrianMole我正在使用最新的SDK,并创建了一个新的解决方案来测试代码段,以防我做了一些设置。但我会在另一台机器上的新安装中检查它。顺便说一句,x64和x86编译中也有相同的错误。我在W3的VS2019中以一致性模式在I上运行了您的代码n调试模式x86和我没有收到任何警告。如果你运行这个确切的示例,你收到警告了吗?我问这个问题是因为
Source.cpp
的编译器警告与你得到的不匹配。它们指的是1300年代的行,这不匹配。最初真正的警告是关于从size\u t转换为int的精度损失。这些错误sages可能只是前一个版本可能发挥作用的后续版本(“见参考资料”)。使用大小作为更正类型,包括chrono,也可能消除与chrono相关的消息。@doug Your warnbing说
Source.cpp(1343,1):警告C4267:
这意味着问题来自第1343行。没有第1343行,因此显示的代码不能是本文中的代码。
1>Source.cpp
1>C:\Users\mgray\Documents\Visual Studio 2017\Projects\CommandLineCPP\stackoverflow\Source.cpp(35,1): warning C4267: 'argument': conversion from 'size_t' to 'CorrectedIntType', possible loss of data
1>C:\Users\mgray\Documents\Visual Studio 2017\Projects\CommandLineCPP\stackoverflow\Source.cpp(54): message : see reference to function template instantiation 'bool `anonymous-namespace'::procFlag<std::string,>(const char *,std::vector<std::string,std::allocator<std::string>> &,T &)' being compiled
1>        with
1>        [
1>            T=std::string
1>        ]
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\include\chrono(632): message : see reference to class template instantiation 'std::chrono::duration<double,std::ratio<1,1>>' being compiled
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\include\chrono(178): message : see reference to class template instantiation 'std::chrono::duration<__int64,std::nano>' being compiled
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\include\chrono(610): message : see reference to class template instantiation 'std::chrono::time_point<std::chrono::steady_clock,std::chrono::nanoseconds>' being compiled