【问题标题】:C++14 errors in C++17, LNK2019, C1001 altogetherC++17、LNK2019、C1001 中的 C++14 错误
【发布时间】:2023-03-06 02:21:02
【问题描述】:

有一个非常简单的 3 文件源。

使用 cl.exe 编译。

  • 使用 /std:c++17 编译时会出现 c++14 错误(error C3533:参数不能有一个包含“自动”的类型)。
  • 使用 /std:c++20 可以编译,但会给出 LNK2019
  • 使用 /std:c++20 时,BUT WITH #include <string>serialization.cpp移出> => database.h,它给出了一个致命的内部编译器error C1001

源文件:

database.h:

#pragma once

#include <map>

struct map_manip 
{
    void operator()(auto& map, uint8_t size = 2);
};

database.cpp:

#include "database.h"

void map_manip::operator()(auto& map, uint8_t size)
{
}

序列化.cpp:

#include "database.h"

#include <string>

struct entry
{
    std::map<std::string_view, uint32_t> units;
};

int main()
{
    entry x;
    map_manip y;
    y(x.units);
}

用c++17编译:

D:\dev\Local\Test>cl /EHsc /std:c++17 serialization.cpp database.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30133 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

serialization.cpp
D:\dev\Local\Test\database.h(8): error C3533: a parameter cannot have a type that contains 'auto'
serialization.cpp(12): error C2664: 'void map_manip::operator ()(unknown-type,uint8_t)': cannot convert argument 1 from 'std::map<std::string_view,uint32_t,std::less<std::string_view>,std::allocator<std::pair<const std::string_view,uint32_t>>>' to 'unknown-type'
D:\dev\Local\Test\database.h(8): note: see declaration of 'map_manip::operator ()'
database.cpp
D:\dev\Local\Test\database.h(8): error C3533: a parameter cannot have a type that contains 'auto'
database.cpp(3): error C3533: a parameter cannot have a type that contains 'auto'
Generating Code...

我相信这些错误在 c++14 中是有效的,但在我们使用 c++17 编译时不应该出现这种情况。如果我错了,请纠正我。


用c++20编译:

D:\dev\Local\Test>cl /EHsc /std:c++20 serialization.cpp database.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30133 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

serialization.cpp
database.cpp
Generating Code...
Microsoft (R) Incremental Linker Version 14.29.30133.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:serialization.exe
serialization.obj
database.obj
serialization.obj : error LNK2019: unresolved external symbol "public: void __thiscall map_manip::operator()<class std::map<class std::basic_string_view<char,struct std::char_traits<char> >,unsigned int,struct std::less<class std::basic_string_view<char,struct std::char_traits<char> > >,class std::allocator<struct std::pair<class std::basic_string_view<char,struct std::char_traits<char> > const ,unsigned int> > > >(class std::map<class std::basic_string_view<char,struct std::char_traits<char> >,unsigned int,struct std::less<class std::basic_string_view<char,struct std::char_traits<char> > >,class std::allocator<struct std::pair<class std::basic_string_view<char,struct std::char_traits<char> > const ,unsigned int> > > &,unsigned char)" (??$?RV?$map@V?$basic_string_view@DU?$char_traits@D@std@@@std@@IU?$less@V?$basic_string_view@DU?$char_traits@D@std@@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@std@@@std@@I@std@@@2@@std@@@map_manip@@QAEXAAV?$map@V?$basic_string_view@DU?$char_traits@D@std@@@std@@IU?$less@V?$basic_string_view@DU?$char_traits@D@std@@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@std@@@std@@I@std@@@2@@std@@E@Z) referenced in function _main
serialization.exe : fatal error LNK1120: 1 unresolved externals

老实说,我根本没有收到此错误,但它似乎与 auto 有某种关联。即使将 auto 更改为 template 并不会改变任何事情,但如果我们从 void operator() 参数中删除 auto&amp; map(两个 database.hdatabase.cpp),然后编译成 .exe 就好了!


用 c++20 编译并从 serialization.cpp 中移动 #include &lt;string&gt; => database.h

database.h:

#pragma once

#include <map>
#include <string>

struct map_manip 
{
    void operator()(auto& map, uint8_t size = 2);
};

序列化.cpp:

#include "database.h"

struct entry
{
    std::map<std::string_view, uint32_t> units;
};

int main()
{
    entry x;
    map_manip y;
    y(x.units);
}

在这种情况下,我只是得到一个内部编译器错误。感觉我应该将此报告给 MSVC 开发人员,但仍在这里提供,以防万一。

D:\dev\Local\Test>cl /EHsc /std:c++20 serialization.cpp database.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30133 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

serialization.cpp
serialization.cpp(5): fatal error C1001: Internal compiler error.
(compiler file 'msc1.cpp', line 1603)
 To work around this problem, try simplifying or changing the program near the locations listed above.
If possible please provide a repro here: https://developercommunity.visualstudio.com
Please choose the Technical Support command on the Visual C++
 Help menu, or open the Technical Support help file for more information
INTERNAL COMPILER ERROR in 'C:\dev\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX86\x86\cl.exe'
    Please choose the Technical Support command on the Visual C++
    Help menu, or open the Technical Support help file for more information

任何想法都将不胜感激。

【问题讨论】:

    标签: c++ c++17 c++14 auto cl


    【解决方案1】:
    1. 函数参数列表中的 auto 构成 abbreviated function template,这是 C++20 的一个特性
    2. 由于函数是模板,所以需要像往常模板一样,将函数定义移动到表头,以进行程序链接;见Why can templates only be implemented in the header file?
    3. 将 ICE 报告给 https://developercommunity.visualstudio.com/home 或通过 帮助 > 发送反馈 > 报告问题...来自 Visual Studio

    【讨论】:

    • 非常感谢!我已经向 MS 报告了这个问题。我还对代码进行了一些更改并使用 CLang 进行了测试:~ cl.exe 崩溃,无论函数实现是否在头文件中。 ~ 另一方面,CLang 在你的建议(1 和 2)实现的情况下编译得非常好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多