【问题标题】:Implicitly convert from std::string to eastl::string从 std::string 隐式转换为eastl::string
【发布时间】:2013-09-07 03:00:01
【问题描述】:

我正在使用来自 stl std::string 的字符串类,现在我想用 eastl 替换所有内容。那么简单的问题:

eastl::string obj = std::string("test");

错误:从“the::string {aka std::basic_string}”转换为 非标量类型‘eastl::string {aka eastl::basic_string}’ 请求

这些类型之间是否可以自动转换?

【问题讨论】:

  • 试试eastl::string str(std::string("test").cstr());
  • 您没有将std::string 初始化为任何内容是不是错字?
  • @Mahesh 是的,抱歉。感谢您的提示。
  • 好吧,只需替换所有内容。您确实没有替换所有内容。为什么你的代码中还有std::string? EASTL 旨在替代标准库,而不是作为补充。
  • 出于我的好奇——你为什么要这样做

标签: c++ string stl


【解决方案1】:

不,如果eastl::string 没有为std::string 定义复制构造函数/赋值运算符,则不会。

std::stringeastl::string 的最简单方法是使用.c_str() 方法获取指向std::string 的内部字符数组的指针

std::string ss("hello");
eastl::string es = ss.c_str(); 

如果您想修改库,您可以添加自己的。 虽然这可能是个坏主意

简单示例:

class MyString {
    private:
        char *str;
    public:
        MyString(const std::string &s) {
            str = new char[s.length() + 1]; /* allocate */
            strcpy(this->str, s.c_str());   /* copy */
        }
        ~MyString() {
            delete [] str;
        }
};

然后你可以创建一个新的 MyString :

MyString ms = std::string("hello");

【讨论】:

  • 虽然没有直接支持转换,但它确实包含所有构建块。无需分叉和修改 EASTL 即可使其正常工作。此外,向无法识别构造函数的人建议专业级库的分支可能是对未来痛苦和绝望的建议。
  • @DavidRodríguez-dribeas 我写这个没问题。我还为这种类型添加了转换运算符到 const char* ,一切正常。问题更像是:如何在不触及原始来源的情况下做到这一点 :) 类似于 ostream 全球运营商。
  • @Ockonal:分叉库的问题是上游的任何更改都必须合并到您的代码库中。有些解决方案不涉及修改库中的代码,这应该是首选。另请注意,标准库中没有转换为const char* 是一个有意识的设计决定。在考虑转换时,请记住:有龙
  • @Ockonal 由于上述原因不鼓励分叉库,除非您实际上可以在进行更改后将更改合并到库中。
【解决方案2】:
eastl::string obj1 = "test";             // works out of the box
eastl::string obj2 = std_string.c_str(); // equivalent to above
eastl::string obj3(&std_string[0],       // another option
                   &std_string[0]+std_string.size());

【讨论】:

  • 嗯。明显的 'eastl::string(std_string.begin(), std_string.end())` 不是一个选项吗?
  • @sehe:好像不是,虽然我没太注意,但是eastl::basic_string好像没有模板构造函数。
【解决方案3】:

这些类不兼容。 eastl::string 没有带有 std::string 参数的构造函数。所以你应该使用这样的东西: srd::string stlstr = "测试"; 东::字符串东lstr=strlstr.c_str();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多