我正在努力将一些旧代码转发到C ++ Builder XE7环境。当我使用低级i / o库编译一个小型独立工具时,我收到此错误:
[ilink32 Error] Error: Unresolved external 'std::char_traits<char>::assign(char *, unsigned int, char)' referenced from <library>|mydate
mydate类并不是非常复杂,只有一个函数真正使用STL类,字符串(惊喜!)。如果我注释掉一个函数的内容,那么错误就会消失。该代码粘贴在下面,但在您查看之前,需要注意以下几点:
这段代码是很久以前写的。我在C ++ Builder 6开发环境中继承了它。几年前我把它带到了C ++ Builder 2010,它似乎工作正常。
它按照它的方式执行的部分原因是此代码也是针对非VCL环境编译的。所有内容都在char *上标准化,因为它是可移植的。
我的第一个猜测是这是一个宽/窄字符串问题。我认为它应该都是窄字符串,但我无法以编译器喜欢的方式使所有内容明确地缩小。
在这种情况下,我找到了一种方法来解决这个问题,让TDateTime为我做格式化,但在更大的应用程序中还有其他情况使用字符串(而不是AnsiString),因为作者正在使用其他STL类(地图等),或者他用它来托管一个他用指针徘徊的字符数组(通常做类似于下面例子的手动标记)。
我没有把所有这些代码都带到21世纪C ++标准的奢侈。我确信有更好的方法可以做很多这些事情,但是我没有足够的时间来重写/更新这个产品套件中的数百万行代码。我的目标是理解为什么这段代码现在会导致问题,以及如何通过尽可能少的修改来修复它。
据我所知,该方法甚至没有被应用程序调用。
班级名称已更改为保护有罪。
所以,在这里。你能告诉我为什么会导致上述链接错误吗?
非常感谢你!
-Karen
string myDate::Format(const char* format) const
{
string output;
if (julian == 0)
return output;
while (format[0] != '\0')
{
if (format[0] == 'm')
{
if (format[1] == 'm')
{
if (format[2] == 'm')
{
if (format[3] == 'm')
{
// mmmm Full name of month.
output += CMonthName();
format += 4;
}
else
{
// mmm Three letter abbreviation of month.
output += CMonthAbbr();
format += 3;
}
}
else
{
// mm Two digit month (zero fill).
const char* ptr = CMonth();
if (ptr[1] == '\0')
output += '0';
output += ptr;
format += 2;
}
}
else
{
// m One or two digit month (blank fill).
const char* ptr = CMonth();
if (ptr[1] == '\0')
output += '0';
output += ptr;
format += 1;
}
}
else if (format[0] == 'd')
{
if (format[1] == 'd')
{
if (format[2] == 'd')
{
if (format[3] == 'd')
{
// dddd Full name of day of week.
output += CDayName();
format += 4;
}
else
{
// ddd Three letter abbreviation of day of week.
output += CDayAbbr();
format += 3;
}
}
else
{
// dd Two digit day of month (zero fill).
const char *ptr = CDay();
if (ptr[1] == '\0')
output += '0';
output += ptr;
format += 2;
}
}
else
{
// d One or two digit day of month (blank fill).
const char *ptr = CDay();
if (ptr[1] == '\0')
output += ' ';
output += ptr;
format += 1;
}
}
else if (format[0] == 'y')
{
if (format[1] == 'y')
{
if (format[2] == 'y')
{
if (format[3] == 'y')
{
// yyyy Four digit year.
output += CYear();
format += 4;
}
else
{
// yyy Not valid (use \y\y\y for yyy)
return string();
}
}
else
{
// yy Two digit year (zero fill).
const char *ptr = CYearAbbr();
if (ptr[1] == '\0')
output += '0';
output += ptr;
format += 2;
}
}
else
{
// y Not valid (use \y or y)
return string();
}
}
else if (format[0] == '\\')
{
if (format[1] != '\0')
{
output += format[1];
format += 2;
}
}
else if (format[0] == ';')
{
// ignore rest of format text
break;
}
else
{
output += format[0];
format += 1;
}
}
return output;
}
答案 0 :(得分:0)
在E:\ Embarcadero \ RAD Studio \ 8.0 \ include \ boost_1_39 \ boost \ test \ utils \ basic_cstring \ basic_cstring.hpp中,在部分赋值运算符中添加以下行:
basic_cstring&安培; assign(basic_cstring&lt; char&gt; const&amp; s){* this = basic_cstring&lt; char&gt;(s.begin(),s.end());返回*这个; }
这对我有用!
答案 1 :(得分:0)
我当时有一个非常类似的问题,并认为我会分享我的解决方案
在“投影选项”下> C ++链接器,我启用了带有动态RTL的链接,它开始为我愉快地链接