Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有将基本类型转换为字符串的无警告模板函数_C++_Templates_Ambiguous - Fatal编程技术网

C++ 是否有将基本类型转换为字符串的无警告模板函数

C++ 是否有将基本类型转换为字符串的无警告模板函数,c++,templates,ambiguous,C++,Templates,Ambiguous,我想提供一个模板函数,将最基本的类型转换为字符串。 到目前为止,我提出的最佳方案如下: template<typename T> inline std::string anyToString(const T& var) { std::ostringstream o; o << var; return o.str(); } class TimeError:public std::runtime_error{ public: e

我想提供一个模板函数,将最基本的类型转换为字符串。 到目前为止,我提出的最佳方案如下:

template<typename T> inline std::string anyToString(const T& var) {
  std::ostringstream o;
  o << var;
  return o.str();
}
 class TimeError:public std::runtime_error{
     public:
       explicit TimeError(int time):std::runtime_error(anyToString(time)),
       mTime(time){};
     protected:
       int mTime;
     };
anyToString和类似函数的问题是在使用gcc版本4.4.3-Wall-Wexta-Werror编译时生成歧义警告 <代码>“ISO C++表示,这些都是模棱两可的,即使第一个最坏的转换比第二个< /代码>的最坏的转换”

更好。
据我所知,发出警告的原因在于调用时隐含的转换可能性。您似乎会从这样的场景中得到这样的消息:

#include <sstream>
#include <string>
#include <iostream>

struct Y {};
struct X
{
    operator Y() const {return Y(); }
};

std::ostream& operator<< (std::ostream& os, X) { return os << "X"; }
std::ostream& operator<< (std::ostringstream& os, Y) { return os << "Y"; }

template<typename T> inline std::string anyToString(const T& var) {
  std::ostringstream o;
  o << var;
  return o.str();
}

int main()
{
    std::cout << anyToString(X()) << '\n';
}
但它们还有其他优点,比如适用于多种流类型


这实际上不适用于几种流类型。例如,如果
T
stringstream
,那么
out就我所知,您的编译器为此目的支持一个#pragma-我知道VC++支持。但是,您也可以使用boost::lexical_cast。

Hmm。您可以添加一个如何使用此模板的示例吗?@Oli Charlesworth:为usage@Martin,当你说“那些选项”时,你说的是什么选项?
boost::lexical_cast()
不适合你?(这并不能解决歧义警告,但滚动您自己的“转换”函数似乎是多余的)@Matthieu:boost::lexical_cast-works。到目前为止,我还不知道,
boost::lexical_cast
会因我的回答中演示的一组类似的重载而失败(除了它使用
stringstream
)。boost::lexical cast会起作用,尽管我必须为这个人和其他将使用该模板的人安装并包括boost。很好的例子,我在描述中添加了真正的邪恶来源,但你的例子也说明了同样的问题-pedantic在我的代码中看起来不错,但我使用了几个qt4库,这些库在警告/错误中是一个噩梦generation@UncleBens:关于
operator@UncleBens当前位置我认为模板@Martin:你自己试试看。现有<代码>operator@UncleBens(有点吹毛求疵):
std::basic_ostream
的重载比
std::ostream
template std::basic_ostream&operator更好
#include <sstream>
#include <string>
#include <iostream>

struct Y {};
struct X
{
    operator Y() const {return Y(); }
};

std::ostream& operator<< (std::ostream& os, X) { return os << "X"; }
std::ostream& operator<< (std::ostringstream& os, Y) { return os << "Y"; }

template<typename T> inline std::string anyToString(const T& var) {
  std::ostringstream o;
  o << var;
  return o.str();
}

int main()
{
    std::cout << anyToString(X()) << '\n';
}
  template<typename T>
    T& operator<<(T& out, const SymRad& angle){
    return out << angle.deg();
  }