оператор ostringstream‹‹ на долгое время?

$ uname -a
Darwin Wheelie-Cyberman 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

$ g++ --version
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cat nolove.cc
#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char ** argv) {
  unsigned long long i = 0;
  ostringstream o();

  // Compiles fine
  cout << i;

  // Explodes, see below
  o << i;

  return 0;
}

$ g++ -o nolove nolove.cc
nolove.cc: In function ‘int main(int, char**)’:
nolove.cc:14: error: invalid operands of types ‘std::ostringstream ()()’ and ‘long long unsigned int’ to binary ‘operator<<’

Я несколько новичок в C++ (но не в программировании или проектировании OO и т. д.), поэтому я предполагаю, что просто делаю это неправильно. На практике unsigned long long выше приравнивается к 64-битному целому числу без знака на моих целевых платформах (выше и g++ 4.4.1 на linux 2.6), другой тип, равный тому же самому, также был бы приемлем (но я не нашел ни одного .)

Могу ли я использовать ostringstream для форматирования этого (или подобного) типа? Если нет, могу ли я сделать это без перетаскивания stdio и snprintf? С более философской точки зрения, как типизация работает так, что cout может это делать, и почему эта функциональность не была расширена на материал строкового потока?


person phs    schedule 29.08.2011    source источник


Ответы (1)


Это потому что это

ostringstream o(); 

не объявляет переменную, а функцию, возвращающую поток.

Попробуйте это вместо

ostringstream o; 

Смотрите также

Самый неприятный разбор: почему A a(()); работать?

person Bo Persson    schedule 29.08.2011
comment
Хм. Благодарю вас! Я думал, что гарантирую вызов конструктора по умолчанию (друг недавно рассказал мне о некоторых проблемах, связанных с типами подов). - person phs; 29.08.2011
comment
Это может быть инициализатор, когда () используется с именем типа, как в new int(). При использовании с нетиповым именем в объявлении он объявляет функцию, например f() (или o() в вашем случае). - person Bo Persson; 29.08.2011