Я пытаюсь перегрузить оператор вставки<<упростить некоторый синтаксис, необходимый для использования определенного программного обеспечения. Это программное обеспечение реализует хеш-объект, который содержит различные типы данных, поэтому проверка типов не может быть выполнена во время компиляции, поскольку тип RHS данного выражения неизвестен до времени выполнения. Этот хэш по духу очень похож на деревья свойств Boost.
Я пытаюсь написать это как шаблонную функцию для извлечения данных из хеша. Это работает очень хорошо, пока принимающая переменная уже существует (инициализируется). Он не компилируется, если это используется во время инициализации переменной.
Итак, это компилируется и работает нормально.
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);
}
int value << data;
не имеет грамматического смысла.
Думать о <<
как и любой другой оператор, скорее как +=
, Да, <<
перегружен, но все равно должен подчиняться той же семантике, что и его естественное воплощение, как побитовый сдвиг.
int value += 3;
например, тоже не имеет смысла.
int value << data;
не является допустимым C ++.