Я пытаюсь перегрузить оператор вставки «< <», чтобы упростить синтаксис, необходимый для использования определенной части программного обеспечения. Это программное обеспечение реализует хэш-объект, который содержит множество типов данных, поэтому проверка типов не может выполняться во время компиляции, поскольку тип 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);
}
Это просто недействительный синтаксис C++. Перегрузка оператора позволяет добавлять новую семантику, но не новый синтаксис. – aschepler