stringstream运算符<<对于模板类型

时间:2010-11-09 11:09:02

标签: c++ templates gcc stl

我有以下代码:

template <class T>
static std::string ToString(const T& t)
{
  stringstream temp;
  temp << t;
  return temp.str();
}

它在Windows上编译时没有使用Visual C ++的问题,但是当尝试在Linux上使用GCC编译它时,我收到以下错误:

no match for 'operator<<' in 'temp << t'

可能是什么原因?

提前谢谢。

2 个答案:

答案 0 :(得分:4)

这取决于类型T,如Space_C0wb0y所说。

查看以下代码

#include <sstream>
#include <iostream>

template<typename T>
static std::string ToString(const T& t){
  std::stringstream temp;
  temp << t;
  return temp.str();
}
struct empty{};
struct non_empty{
  std::string str;
  non_empty(std::string obj):str (obj){}
  friend std::ostream& operator << (std::ostream& out, const non_empty &x);
};

std::ostream& operator << (std::ostream& out, const non_empty &x){
    out << x.str;
    return out;
}

int main(){
   std::string s = ToString<double>(12.3); // this will work fine
 /*********************************************************************************
  * std::string k = ToString(empty()); // no match for 'operator<<' in 'temp << t'*
  *********************************************************************************/
   std::string t = ToString(non_empty("123")); // this works too

}

ToString(empty());的调用会产生与您相同的错误,但ToString(non_empty("123"));fine。这意味着什么?

答案 1 :(得分:0)

您可能只是错过了文件顶部的#include<sstream>

这可以解释为什么相同的代码可以在Windows上编译,因为标准头之间存在差异。

当我使用类型为const char*的模板时,这就是我的解决方案。