【问题标题】:error: no matching function for call to ‘to_string(std::basic_string<char>&)’错误:没有匹配函数调用‘to_string(std::basic_string<char>&)’
【发布时间】:2015-06-02 20:53:21
【问题描述】:

即使在模板中我可以有任何类型,to_string 函数也不适用于基本字符串:

例如:

std::string str("my string");
my_class(str);

使用这个函子定义:

template<class valuetype>
void operator()(valuetype value)
{
    ...
    private_string_field = std::to_string(value);

不起作用。这是错误:

错误:没有匹配的调用函数 ‘to_string(std::basic_string&)’

避免它的最佳方法是什么。

提前,我请求避免仅仅因为一些常见的关键字而链接到不相关的问题。

【问题讨论】:

  • 我不打算讨论不为to_string 重载std::string 是否有意义,但是......为什么在上面的代码中使用它? operator&lt;&lt; 可以处理以较低成本定义 to_string 的任何内容(无需通过中间 std::string
  • @DavidRodríguez-dribeas 你是对的。我只是想缩短代码,所以我放了一个cout。事实上,我需要将它存储在某个地方并打印以备后用。在日志文件中。

标签: c++ string c++11 compiler-errors


【解决方案1】:

std::to_string 仅适用于基本数字类型。

如果您需要更通用的函数,boost::lexical_cast 将适用于更多类型 - 实际上是可以发送到 iostream 的任何类型。

#include <boost/lexical_cast.hpp>

...

private_string_field = boost::lexical_cast<std::string>(value);

【讨论】:

    【解决方案2】:

    基本字符串没有to_string。不会有事的。

    根据Benjamin Lindley 的建议,我会考虑以下设计,使用to_string 但提供默认模板:

    #include <iostream>
    #include <string>
    struct Type {
      explicit operator std::string() const{
        return std::string("I am type");
      }
    };
    
    namespace std {
    template <typename T>
      string to_string(const T& value) {
        return string(value);
      }
    }
    
    int main(int argc, char **argv) {
        // this is what would be in class
        Type x;
        std::string private_string_field;
        private_string_field = std::to_string(42);
        std::cout << private_string_field << std::endl;
    
        private_string_field = std::to_string(x);
        std::cout << private_string_field << std::endl;
        return 0;
    }
    

    默认情况下,它会尝试将操作数转换为字符串。这样自定义类型可以提供自己的转换。另一种设计是在内部使用stringstreamoperator&lt;&lt; 进行转换,如下所示:

    #include <iostream>
    #include <string>
    #include <sstream>
    
    struct Type {
      friend std::ostream& operator<<(std::ostream& out, const Type& value){
        return out << "Type through operator<<";
      }
    };
    
    template <class T>
    std::string to_str(const T& value) {
      std::string ret;
      std::ostringstream ss;
      ss << value;
      ret = ss.str();
      return ret;
    };
    
    int main(int argc, char **argv) {
        // this is what would be in class
        Type x;
        std::string private_string_field;
        private_string_field = to_str(42);
        std::cout << private_string_field << std::endl;
    
        private_string_field = to_str(x);
        std::cout << private_string_field << std::endl;
    
        return 0;
    }
    

    【讨论】:

    • 这是一个很好的分析,直到问题中的代码发生了巨大变化。 :|
    • 现在它可以正确处理字符串,但其他的不多。
    • @BenjaminLindley 你能详细说明一下吗?其他东西需要对std::string 进行“转换”。或者你的意思是,例如int 不起作用?那么另一种方法是为to_string 编写一个模板重载,默认情况下它会尝试转换为string。不确定它是否是更好的设计。
    • 是的,我就是这个意思。它不会处理intdouble 或有std::to_string.overloads 的任何其他类型。
    • @BenjaminLindley 我更新了我的答案。不确定它是否比 Drew 的更好(可能不是),但至少它适用于您提到的情况。感谢您指出。
    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多