$ 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 ++ (но не в программировании, не в дизайне ОО и т. Д.), Поэтому я предполагаю, что просто делаю это неправильно. На практике unsigned long long выше равняется unsigned 64-битному целому числу на моих целевых платформах (выше и g ++ 4.4.1 в linux 2.6), также был бы приемлем другой тип, который равнялся бы тому же самому (но я не нашел никакого .)
Могу ли я использовать ostringstream для форматирования этого (или аналогичного) типа? Если нет, могу ли я сделать это без перетаскивания в stdio и snprintf? Говоря более философски, как типизация работает так, что cout может это сделать, и почему эта функциональность не была расширена до содержимого потока строк?