簡體   English   中英

如何在C ++中向前聲明typedef?

[英]How do I forward declare a typedef in C++?

我有兩個名稱空間( FM ),其中使用typedef定義了一些內容。 我在一個名稱空間中使用typedef在另一個名稱空間中聲明一個變量。

例如,我有以下文件:

文件M.hpp

#ifndef M_HPP
#define M_HPP

#include "F.hpp"

namespace M{
    typedef std::vector<F::myD> VectorDouble;

class M{
    private:
        VectorDouble Diction;
};
}

#endif  // M_HPP

文件F.hpp

#ifndef F_HPP
#define F_HPP

#include "M.hpp"

namespace F{
    typedef double myD;

class MyF{
    private:
        M::VectorDouble myVar;
};
}

#endif  // F_HPP

顯而易見,這兩個頭文件創建了循環依賴關系,因此可能需要進行前向聲明,但是如何使用名稱空間和typedef來實現呢?

使用文件namespace.cpp驅動代碼:

#include <iostream>
#include <vector>

#include "M.hpp"
#include "F.hpp"

int main(){
    std::cout << "Learning how to access stuff in a namespace." << std::endl;

    F::MyF myFInstance;
    M::M myMInstance;

    return 0;
}

嘗試編譯時,出現錯誤,表明我的M是未聲明的標識符(請參見下面的確切錯誤消息)。 我不明白為什么M不被視為namespace

$ clang++ -std=c++11 -stdlib=libc++ namespace.cpp -o namespace
In file included from namespace.cpp:5:
In file included from ./M.hpp:5:
./F.hpp:12:9: error: use of undeclared identifier 'M'
        M::VectorDouble myVar;
        ^
1 error generated.

如何從另一個名稱空間訪問typedef? 這是前向聲明問題嗎?

您的問題是您已經創建了包括的通告

根據您自己的編碼,文件F.hpp必須先包含M.hpp才能編譯。

而且M.hpp必須先包含F.hpp才能編譯。

因此,兩個標頭都不能編譯。 有關循環依賴的解決方案,請參見此SO帖子

編輯:

您可以像這樣向前聲明您的typedef。

文件F_fwd.hpp

#ifndef F_FWD_HPP
#define F_FWD_HPP

namespace F{
    typedef double myD;
}

#endif // F_FWD_HPP

您的兩個標頭彼此包含在一起,這將導致循環引用,並且使用標頭域,一個文件可以完全排除在其他標頭之一中。

暫無
暫無

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

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