2014-05-30 2 views
1

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

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

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

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); 
    } 
+0

Это просто недействительный синтаксис C++. Перегрузка оператора позволяет добавлять новую семантику, но не новый синтаксис. – aschepler

ответ

2

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

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

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

Смежные вопросы