оператор stringstream << для типа шаблона - PullRequest
3 голосов
/ 09 ноября 2010

У меня есть следующий код:

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

Он компилируется без проблем с Visual C ++ в Windows, но при попытке компилировать его с GCC в Linux я получаю следующую ошибку:

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

В чем может быть причина?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

Это зависит от типа 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")); это отлично .Что это значит?

0 голосов
/ 16 января 2013

Возможно, вы просто пропускаете #include<sstream> в верхней части вашего файла.

Это объясняет, почему идентичный код может компилироваться в Windows из-за различий между стандартными заголовками.

Это было решением в моем случае, когда использовался шаблон с типом const char*.

...