类型检查受保护的标记联合

Typechecking protected tagged union

本文关键字:检查 受保护 类型      更新时间:2023-10-16

我必须构建一个表达式树,我这样做如下。我有一个树,它的根类型为 TreeNode<Token>* 令牌和树节点如下所示:

struct Token {
    enum{
        PLUS, MINUS, NUMBER, VARIABLE, SIN, COS, POW, PRODUCT, DIVIDE, PI
    } type;
    union{
        char variable;
        double number;
    };//union
};
template <class T>
class TreeNode{
    public:
        TreeNode();
        ~TreeNode();
        TreeNode<T>* getLeft() const;
        TreeNode<T>* getRight() const;
        void setLeft(TreeNode<T>* node);
        void setRight(TreeNode<T>* node);
        void setInfo(T value);
        T getInfo() const;
    protected:
        T info;
        TreeNode<T> *left;
        TreeNode<T> *right;
};

我的问题是我不知道访问令牌的类型,因为信息受到保护。我试过类似的东西

 root->getInfo().number = cos(root->getRight()->getInfo().number);

(在这里我知道根有一个正确的孩子,它具有正确的类型等,所以这应该没问题(但这给我带来了以下错误:

error: using temporary as lvalue [-fpermissive]

请帮忙!

TreeNode<T>::getInfo 的签名返回T,这是一个临时的。您不想尝试分配给它,因为这将不起作用。

相反,请调用 TreeNode<T>::setInfo 将基础Token替换为所需的基础。