This is basically the same question as [SO]: C2491: 'std::numpunct<_Elem>::id' : definition of dllimport static data member not allowed [closed], but considering the following facts:
- That (on my opinion) is a perfectly valid question (according to [SO]: How to create a Minimal, Complete, and Verifiable example), I really don't know why some users felt the urge of closing it
- The answer marked as a solution provides guidelines the for fixing the error (in general), but doesn't apply to current case, and certainly, doesn't fix it,
please don't close it or mark it as a duplicate (at least, not without carefully reading and understanding it).
main.cpp:
#include <sstream>
//#define THROW_C2491
#if defined(THROW_C2491)
typedef int CharType;
#else
typedef char CharType;
#endif
int main() {
std::basic_stringstream<CharType> stream;
CharType c = 0x41;
stream << c;
return 0;
}
The code is slightly modified (simplified), and fails to compile if THROW_C2491
is defined:
xlocnum(294): error C2491: 'std::numpunct<_Elem>::id': definition of dllimport static data member not allowed
Output:
E:\Work\Dev\StackOverflow\q048716223>"c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" amd64 E:\Work\Dev\StackOverflow\q048716223> E:\Work\Dev\StackOverflow\q048716223>"c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\bin\amd64\cl.exe" /GS /W3 /Zc:wchar_t /ZI /Gm /Od /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /EHsc /nologo -c "src\main.cpp" main.cpp E:\Work\Dev\StackOverflow\q048716223>echo %errorlevel% 0 E:\Work\Dev\StackOverflow\q048716223> E:\Work\Dev\StackOverflow\q048716223>"c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\bin\amd64\cl.exe" /GS /W3 /Zc:wchar_t /ZI /Gm /Od /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /EHsc /nologo -c "src\main.cpp" /D "THROW_C2491" main.cpp c:\install\x86\microsoft\visual studio community\2015\vc\include\xlocnum(294): warning C4273: 'id': inconsistent dll linkage c:\install\x86\microsoft\visual studio community\2015\vc\include\xlocnum(120): note: see previous definition of 'public: static std::locale::id std::numpunct<int>::id' c:\install\x86\microsoft\visual studio community\2015\vc\include\xlocnum(120): note: while compiling class template static data member 'std::locale::id std::numpunct<_Elem>::id' with [ _Elem=CharType ] c:\install\x86\microsoft\visual studio community\2015\vc\include\xlocnum(1261): note: see reference to function template instantiation 'const _Facet &std::use_facet<std::numpunct<_Elem>>(const std::locale &)' being compiled with [ _Facet=std::numpunct<CharType>, _Elem=CharType ] c:\install\x86\microsoft\visual studio community\2015\vc\include\xlocnum(1255): note: while compiling class template member function 'std::ostreambuf_iterator<_Elem,_Traits> std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>>::do_put(_OutIt,std::ios_base &,_Elem,bool) const' with [ _Elem=CharType, _Traits=std::char_traits<CharType>, _OutIt=std::ostreambuf_iterator<CharType,std::char_traits<CharType>> ] c:\install\x86\microsoft\visual studio community\2015\vc\include\ostream(305): note: see reference to class template instantiation 'std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>>' being compiled with [ _Elem=CharType, _Traits=std::char_traits<CharType> ] c:\install\x86\microsoft\visual studio community\2015\vc\include\ostream(291): note: while compiling class template member function 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)' with [ _Elem=CharType, _Traits=std::char_traits<CharType> ] e:\work\dev\stackoverflow\q048716223\src\main.cpp(16): note: see reference to function template instantiation 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)' being compiled with [ _Elem=CharType, _Traits=std::char_traits<CharType> ] c:\install\x86\microsoft\visual studio community\2015\vc\include\istream(939): note: see reference to class template instantiation 'std::basic_ostream<_Elem,_Traits>' being compiled with [ _Elem=CharType, _Traits=std::char_traits<CharType> ] c:\install\x86\microsoft\visual studio community\2015\vc\include\sstream(574): note: see reference to class template instantiation 'std::basic_iostream<_Elem,_Traits>' being compiled with [ _Elem=CharType, _Traits=std::char_traits<CharType> ] e:\work\dev\stackoverflow\q048716223\src\main.cpp(14): note: see reference to class template instantiation 'std::basic_stringstream<CharType,std::char_traits<_Elem>,std::allocator<_Elem>>' being compiled with [ _Elem=CharType ] c:\install\x86\microsoft\visual studio community\2015\vc\include\xlocnum(294): error C2491: 'std::numpunct<_Elem>::id': definition of dllimport static data member not allowed with [ _Elem=CharType ] E:\Work\Dev\StackOverflow\q048716223>echo %errorlevel% 2
Notes:
- Everything is VStudio 2015 specific, but the problem is reproducible using VStudio 2017, VStudio 2013, VStudio 2010 (of course, the line numbers differ). However, it works using VStudio 2005
- I chose to paste the compiler commands(s) and output(s) from the cmdline, instead of placing pictures with compiler flags and output (from VStudio IDE), so it's easier to reproduce (if anyone is willing to try)
- The compiler flags are defaults from an Application (.exe) VStudio project (Win32), except some irrelevant path related ones (e.g. .pch file and other such crap), that I stripped out
- Compiles only if CharType is char (or any of the narrow character types, as a matter of fact) or wchar_t. Disabling [MS.Docs]: /Zc:wchar_t (wchar_t Is Native Type) adds unsigned short to the list (which seems natural)
- Compiles without problems under Lnx (Ubtu 16 x64) / g++ (gcc 5.4.0)
[MS.Docs]: Compiler Error C2491 is pretty straightforward, I am familiar with it, there are some answers (e.g. [SO]: Linker error when calling a C function from C++ code in different VS2010 project (@CristiFati's answer), [SO]: Excel VBA, Can't Find DLL Entry Point from a DLL file (@CristiFati's answer)) to back me up.
Considering the above notes, I know that it's something that has to do with Win's way (limitation?) of handling chars, but I don't see any (immediate) connection between the code and the error. Nothing regarding this behavior on [MS.Docs]: basic_stringstream Class. I (shallowly) browsed the involved standard include headers, but I didn't get to the bottom of it so far. Am I missing smth extremely obvious?
Other references (same or similar error, but none containing a valid fix):
- [SO]: VC++: Code works in VS2010 and breaks in VS2013
- [MS.MSDN]: VS2010 error C2491: 'std::numpunct<_Elem>::id while using std::basic_fstream in c++/cli
- [DeveloperIT]: std::basic_stringstream won't compile with MSVC 10
- [itgo]: visual c++ - VC++: Code works in VS2010 and breaks in VS2013
It is worth mentioning that the end goal is to build some 3rd-party software that instantiates some 32 bit char based streams.
CharType
onlychar
,unsigned short
andwchar_t
. for all another types will be this error – RuellaCharType
, this is a fact. Are you seeking for how MSVC forbids other types, or why MSVC forbids other types, or what types are allowed? – Segalman