MSVS2010+std::basic_ofstream<unsigned char> = C4273
От: Аноним  
Дата: 18.04.11 13:48
Оценка:
День добрый.

Есть проект(dll, компилятор 2010 студия), во всем проекте один cpp-файл:

#include <fstream>

void foo(std::basic_ofstream<unsigned char>& os)
{ 
    os << *(int*)&(*  (unsigned char*)(0) );
}


При компиляции получаю:

c:\program files\microsoft visual studio 10.0\vc\include\xlocnum(133): warning C4273: id: несовместимая компоновка dll
1> c:\program files\microsoft visual studio 10.0\vc\include\xlocnum(65): см. предыдущее определение "public: static std::locale::id std::numpunct<unsigned char>::id"
1> c:\program files\microsoft visual studio 10.0\vc\include\xlocnum(65): при компиляции статичных данных-члена "std::locale::id std::numpunct<_Elem>::id" класса шаблон
1> with
1> [
1> _Elem=unsigned char
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\xlocnum(1149): см. ссылку на создание экземпляров функции шаблон при компиляции "const _Facet &std::use_facet<std::numpunct<_Elem>>(const std::locale &)"
1> with
1> [
1> _Facet=std::numpunct<unsigned char>,
1> _Elem=unsigned char
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\xlocnum(1143): при компиляции функции-члена "std::ostreambuf_iterator<_Elem,_Traits> std::num_put<_Elem,_OutIt>::do_put(_OutIt,std::ios_base &,_Elem,std::_Bool) const" класса шаблон
1> with
1> [
1> _Elem=unsigned char,
1> _Traits=std::char_traits<unsigned char>,
1> _OutIt=std::ostreambuf_iterator<unsigned char,std::char_traits<unsigned char>>
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\ostream(295): см. ссылку на создание экземпляров класса шаблон при компиляции "std::num_put<_Elem,_OutIt>"
1> with
1> [
1> _Elem=unsigned char,
1> _OutIt=std::ostreambuf_iterator<unsigned char,std::char_traits<unsigned char>>
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\ostream(281): при компиляции функции-члена "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)" класса шаблон
1> with
1> [
1> _Elem=unsigned char,
1> _Traits=std::char_traits<unsigned char>
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\fstream(924): см. ссылку на создание экземпляров класса шаблон при компиляции "std::basic_ostream<_Elem,_Traits>"
1> with
1> [
1> _Elem=unsigned char,
1> _Traits=std::char_traits<unsigned char>
1> ]
1> c:\documents and settings\aosipov\мои документы\visual studio 2010\projects\xxx\zzz\zzz.cpp(5): см. ссылку на создание экземпляров класса шаблон при компиляции "std::basic_ofstream<_Elem>"
1> with
1> [
1> _Elem=unsigned char
1> ]
1>c:\program files\microsoft visual studio 10.0\vc\include\xlocnum(133): error C2491: std::numpunct<_Elem>::id: определение dllimport статические данные-член не разрешено
1> with
1> [
1> _Elem=unsigned char
1> ]


Исправляется двумя методами:
1. Изменение с "Многопоточная отладка DLL (/MDd)" на "Многопоточная отладка (/MTd)"
2. Замена std::basic_ofstream<unsigned char> на std::basic_ofstream<char>

Есть ли нормальные методы лечения? В 2008 студии все нормально.

P.S. Код, приведенный выше, исключительно демонстрационный.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.