C++ и переходы на метки

Все о программировании под *nix
Аватара пользователя
satanic_mechanic
Интересующийся
Сообщения: 56
Зарегистрирован: 18 июл 2003, 01:36
Контактная информация:

C++ и переходы на метки

Сообщение satanic_mechanic »

Заголовочный файл

Код: Выделить всё

#ifndef __symbol_scalar_hxx
#define __symbol_scalar_hxx

#include "symbol.hxx"

#include "pyxis_lexer.hxx"

#include <string>

namespace engine_stuff {

  struct symbol_scalar_exception {
    enum symbol_scalar_exception_type {
      undefined_variable
    } type;

    symbol_scalar_exception (symbol_scalar_exception_type t): type (t)
    {}
  };

  class symbol_scalar: public symbol {
  public:
    enum symbol_scalar_type {
      undef_scalar, bool_scalar, double_scalar, string_scalar
    };

  private:
    std::string name;

    symbol_scalar_type type;

    bool        bool_value;
    double      double_value;
    std::string string_value;

  public:
    symbol_scalar (std::string & n);

    bool operator == (const symbol_scalar & symb) const;
    long hfunc ();

    void set_type (symbol_scalar_type t);

    void set_value (bool bool_val);
    void set_value (double double_val);
    void set_value (std::string & string_val);

    const symbol_scalar_type & get_type ();

    const bool &        get_bool_value ();
    const double &      get_double_value ();
    const std::string & get_string_value ();
  };

};

#endif // __symbol_scalar_hxx
Реализация функции get_string_value:

Код: Выделить всё

const std::string &
engine_stuff::symbol_scalar::get_string_value ()
{
  switch (type) {
  case undef_scalar:
    throw symbol_scalar_exception (symbol_scalar_exception::undefined_variable);
  case bool_scalar:
    string_value = bool_value ? "true" : "false";
    break;
  case double_scalar:
    char tmp[100];
    {
      std::strstream string_value_stream (tmp, sizeof (tmp), std::ios::in | std::ios::out);
      string_value_stream << double_value;
      string_value_stream >> string_value;
    }

    break;
  case string_scalar:
    break;
  }

  return string_value;
}
Блок

Код: Выделить всё

    {
      std::strstream string_value_stream (tmp, sizeof (tmp), std::ios::in | std::ios::out);
      string_value_stream << double_value;
      string_value_stream >> string_value;
    }
пришлось заключить в фигурные скобки, т.к. g++-3.0 не захотел компилить (поcкольку для string_value_stream в конце блока switch генерируется деструктор, но при переходе на case string_scalar объект string_value_stream не будет создан.

Теперь непосредственно вопрос, почему не захотело компилиться так:

Код: Выделить всё

  case double_scalar:
    char tmp[100];

    std::strstream string_value_stream (tmp, sizeof (tmp), std::ios::in | std::ios::out);
    string_value_stream << double_value;
    string_value_stream >> string_value;
    string_value_stream.~strstream ();

    break;
Здесь я явно вызываю деструктор... Не понимаю..
а по ночам, девушка, я программы пишу ...