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