C++17、LNK2019、C1001 中的 C++14 错误
C++14 errors in C++17, LNK2019, C1001 altogether
有一个非常简单的 3 文件源。
编译 cl.exe.
- 使用 /std:c++17 它编译时出现 c++14 错误(error C3533: 参数的类型不能包含 'auto').
- 使用 /std:c++20 它编译但给出 LNK2019.
- 当使用 /std:c++20 时,但是
#include <string>
从 serialization.cpp => database.h, 它给出了一个致命内部编译器错误 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)
{
}
serialization.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& map
(database.h 和 database.cpp ), 然后编译成.exe就好了!
使用 c++20 编译并从 serialization.cpp 移动 #include <string>
=> database.h
database.h:
#pragma once
#include <map>
#include <string>
struct map_manip
{
void operator()(auto& map, uint8_t size = 2);
};
serialization.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 Studio19\Community\VC\Tools\MSVC.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
如有任何想法,我们将不胜感激。
函数参数列表中的 auto
构成一个 abbreviated function template,一个 C++20 特性
- 由于函数是模板,需要将函数定义移动到header,和模板一样,使程序link;见 Why can templates only be implemented in the header file?
- 向 https://developercommunity.visualstudio.com/home 或通过 帮助 > 发送反馈 > 报告问题... 来自 Visual Studio
报告 ICE
有一个非常简单的 3 文件源。
编译 cl.exe.
- 使用 /std:c++17 它编译时出现 c++14 错误(error C3533: 参数的类型不能包含 'auto').
- 使用 /std:c++20 它编译但给出 LNK2019.
- 当使用 /std:c++20 时,但是
#include <string>
从 serialization.cpp => database.h, 它给出了一个致命内部编译器错误 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)
{
}
serialization.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& map
(database.h 和 database.cpp ), 然后编译成.exe就好了!
使用 c++20 编译并从 serialization.cpp 移动 #include <string>
=> database.h
database.h:
#pragma once
#include <map>
#include <string>
struct map_manip
{
void operator()(auto& map, uint8_t size = 2);
};
serialization.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 Studio19\Community\VC\Tools\MSVC.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
如有任何想法,我们将不胜感激。
-
函数参数列表中的
auto
构成一个 abbreviated function template,一个 C++20 特性- 由于函数是模板,需要将函数定义移动到header,和模板一样,使程序link;见 Why can templates only be implemented in the header file?
- 向 https://developercommunity.visualstudio.com/home 或通过 帮助 > 发送反馈 > 报告问题... 来自 Visual Studio 报告 ICE