首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法解析的外部'std::char_traits<char>::assign(char *,unsigned int,char)‘

无法解析的外部'std::char_traits<char>::assign(char *,unsigned int,char)‘
EN

Stack Overflow用户
提问于 2015-07-01 05:03:54
回答 2查看 811关注 0票数 0

我正在努力将一些旧代码带到C++Builder XE7环境中。当我用低级i/o库编译一个小的独立工具时,我得到了这个错误:

代码语言:javascript
复制
[ilink32 Error] Error: Unresolved external 'std::char_traits<char>::assign(char *, unsigned int, char)' referenced from <library>|mydate

mydate类并不是非常复杂,而且只有一个函数真正使用了STL类,string (令人惊讶!)如果我注释掉一个函数的内容,错误就会消失。该代码粘贴在下面,但在您查看它之前,有几件事需要注意:

  1. 这段代码是很久以前写的。我在C++ Builder6开发环境中继承了它。我在几年前将它带到了VCLBuilder2010,在那里它似乎工作得很好。
  2. 它这样做的部分原因是它也是为非C++环境编译的。
  3. 我的第一个猜测是,这是一个宽/窄字符串的问题。我认为它应该都是窄字符串,但我不能以编译器喜欢的方式显式地缩小所有内容。
  4. 在这种情况下,我找到了一种方法来解决这个问题,让TDateTime为我做格式化,但在使用字符串(而不是AnsiString)的大型应用程序中还有其他情况,要么是因为作者正在使用其他STL类(映射等),要么是因为他正在使用它来托管一个字符数组,他正在使用指针(通常是进行类似于下面的示例的手动标记)。
  5. 我没有机会将所有这些代码都提高到21世纪的C++标准。我确信有更好的方法来做这些事情,但是我没有足够的时间来重写/更新这个产品套件中数百万行的代码。我在这里的目标是理解为什么这段代码现在会导致问题,以及如何在尽可能少的更改的情况下修复它。据我所知,这个方法甚至不是由application.
  6. The类调用的。
  7. 为了保护有罪的人,已经更改了名称。

所以,这就是它。你能告诉我为什么这会导致上面的链接错误吗?

非常感谢!

-Karen

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2016-03-06 20:49:27

在E:\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\test\utils\basic_cstring\basic_cstring.hpp,的赋值运算符部分中,添加以下行:

返回赋值( basic_cstring& const& s){ *this = basic_cstring( s.begin(),s.end() );basic_cstring *this;}

这对我很有效!

票数 0
EN

Stack Overflow用户

发布于 2019-05-17 03:17:38

我只是遇到了一个非常类似的问题,我想我应该分享我的解决方案

在“投影选项”>“C++链接器”下,我启用了“使用动态RTL链接”,它很高兴地开始了链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31148474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档