簡體   English   中英

C++ 枚舉中沒有命名類型

[英]no type named on C++ enumeration

我有一個“關系”class 的聲明,它需要初始化“relation_label”值。

namespace hr {
    class node;

    enum relation_label : uint8_t {
        HAS, CONTAINS, IS_PARALLEL, INCLUDES, IS, PART_OF, LEADS_TO, IN
    };


    template<typename N>
    class relation : public std::vector<N> {
    private:
        relation(const relation &) = default;

    public:
        const relation_label label;

        relation(relation_label l) : std::vector<N>(0) {
            this->label = l;
        };
    };
}

此代碼編譯,但創建關系對象的新實例不會編譯。 例如,以下錯誤:

relation<word *> includes(relation_label::INCLUDES);

是“在 'hr::relation_label' 中沒有名為 'INCLUDES' 的類型”。

任何想法? 非常感謝。

您看到的錯誤可能是由之前的另一個錯誤引起的,即:

const成員必須內聯或使用 member-init-list 進行初始化。 在構造函數的主體中,它們已經是const

改變

    relation(relation_label l) : std::vector<N>(0) {
        this->label = l;
    };

    relation(relation_label l) : std::vector<N>(0), label(l) {
    }

另外,我希望word是在您的應用程序某處定義的類型。


=== 編輯 ===

來自評論:

“單詞”是這樣定義的:

 class word; class word_related: public named_node { public: relation<word*> includes(relation_label::INCLUDES); };

relation<word*> includes(relation_label::INCLUDES)是什么意思? 它看起來像是一個成員 function includes()的定義,但隨后的relation_label::INCLUDES必須是一個類型。 顯然不是。

也許你的意思是

relation<word*> includes(relation_label lbl = relation_label::INCLUDES);

?

當您嘗試在產生編譯錯誤的行中創建關系 object 的新實例時,請嘗試使用括號初始化

relation<word*> includes{relation_label::INCLUDES};

反而。 編譯之前的代碼時

class word_related : public named_node {
public: relation<word*> includes(relation_label::INCLUDES);
};

編譯器認為您將要聲明一個名為includes class named_node 的成員named_node (因此它需要函數參數的類型而不是“值”),而不是定義默認初始化的成員變量。

這個答案是對 rustyx 答案的補充,他解決了 const 成員變量缺少初始化的最重要的一點。

可以在此處找到代碼,並應用了 rustyx 答案中的修復程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM