Проблема с перегрузкой оператора C++: ожидаемый инициализатор перед токеном '‹‹'

Я пытаюсь перегрузить оператор вставки '‹‹', чтобы упростить некоторый синтаксис, необходимый для использования определенного программного обеспечения. Это программное обеспечение реализует хэш-объект, который содержит различные типы данных, поэтому проверка типов не может быть выполнена во время компиляции, поскольку тип RHS данного выражения неизвестен до времени выполнения. Этот хэш очень похож по духу на Boost Property Trees.

Я пытаюсь написать это как функцию шаблона для извлечения данных из хеша. Это прекрасно работает, пока принимающая переменная уже существует (инициализирована). Не удается скомпилировать, если это используется во время инициализации переменной.

Итак, это компилируется и работает нормально.

int value;
value << data;

Но это вообще не компилируется.

int value << data;

Реальный код довольно большой и сложный, поэтому я написал следующую упрощенную программу, демонстрирующую такое же поведение.

Я использую gcc версии 4.3.4. Другой компилятор не вариант.

Любая помощь приветствуется.

#include <iostream>

/**
  * Simple class to use with the templates.
  */
class Data
  {
public:
    Data ()
      {
        m_value = 0;
      }
    Data (int val)
      {
        m_value = val;
      }
    ~Data ()
      {
      }
    int value ()
      {
        return (m_value);
      }
    int value (int val)
      {
        m_value = val;
        return (value ());
      }
private:
    int m_value;
  };

/**
  * Assign data from RHS to LHS.
  */
template <class T>
void operator<< (T &data, Data &node)
  {
    data = node.value ();
  }

/**
  * Simple test program.
  */
int main (int argc, char *argv[])
  {
    // initialize the data
    Data data (123);
    std::cout << data.value () << std::endl;

    // extract the data and assign to integer AFTER initialization
    int value;
    value << data;
    std::cout << value << std::endl;

    // extract the data and assign to integer DURING initialization
    // *** problem is here ***
    int other << data; // <-- this fails to compile with...
    // expected initializer before '<<' token
    std::cout << other << std::endl;

    return (0);
  }

person user3691884    schedule 30.05.2014    source источник
comment
Это просто недопустимый синтаксис C++. Перегрузка операторов позволяет добавлять новую семантику, но не новый синтаксис.   -  person aschepler    schedule 30.05.2014


Ответы (2)


int value << data; не имеет грамматического смысла.

Думайте о << как о любом другом операторе, скорее как о +=. Да, << перегружен, но он по-прежнему должен подчиняться той же семантике, что и его естественное воплощение в виде побитового сдвига.

int value += 3; например тоже не имеет смысла.

person Bathsheba    schedule 30.05.2014

int value << data; не является допустимым C++.

person quantdev    schedule 30.05.2014