未解析的外部'std :: char_traits <char> :: assign(char *,unsigned int,char)'

时间:2015-06-30 21:03:54

标签: string stl linker c++builder

我正在努力将一些旧代码转发到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类,字符串(惊喜!)。如果我注释掉一个函数的内容,那么错误就会消失。该代码粘贴在下面,但在您查看之前,需要注意以下几点:

  1. 这段代码是很久以前写的。我在C ++ Builder 6开发环境中继承了它。几年前我把它带到了C ++ Builder 2010,它似乎工作正常。

  2. 它按照它的方式执行的部分原因是此代码也是针对非VCL环境编译的。所有内容都在char *上标准化,因为它是可移植的。

  3. 我的第一个猜测是这是一个宽/窄字符串问题。我认为它应该都是窄字符串,但我无法以编译器喜欢的方式使所有内容明确地缩小。

  4. 在这种情况下,我找到了一种方法来解决这个问题,让TDateTime为我做格式化,但在更大的应用程序中还有其他情况使用字符串(而不是AnsiString),因为作者正在使用其他STL类(地图等),或者他用它来托管一个他用指针徘徊的字符数组(通常做类似于下面例子的手动标记)。

  5. 我没有把所有这些代码都带到21世纪C ++标准的奢侈。我确信有更好的方法可以做很多这些事情,但是我没有足够的时间来重写/更新这个产品套件中的数百万行代码。我的目标是理解为什么这段代码现在会导致问题,以及如何通过尽可能少的修改来修复它。

  6. 据我所知,该方法甚至没有被应用程序调用。

  7. 班级名称已更改为保护有罪。

  8. 所以,在这里。你能告诉我为什么会导致上述链接错误吗?

    非常感谢你!

    -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;
    }
    

2 个答案:

答案 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的链接,它开始为我愉快地链接

相关问题