C ++运算符重载问题:'<<'之前的预期初始化程序代币

时间:2014-05-30 15:49:07

标签: c++ templates compiler-construction initializer

我正在尝试重载插入操作符'<<<&#简化使用特定软件所需的语法。该软件实现了一个包含各种类型数据的哈希对象,因此无法在编译时进行类型检查,因为在运行时才知道给定表达式的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);
  }

2 个答案:

答案 0 :(得分:3)

int value << data;没有语法意义。

<<视为与任何其他运算符一样,而非+=。是的,<<被重载但它仍然必须遵循与其自然化身相同的语义作为按位移位。

例如,

int value += 3;也没有任何意义。

答案 1 :(得分:0)

int value << data;无效C ++。