簡體   English   中英

使用聲明與前瞻聲明之間的沖突

[英]Conflict between Using Declaration and Forward Declaration

讓我們去Bulldog散步:)

說我有一個命名空間中Street::House (命名空間里Street其中類) Bulldog 聲明 (讓它在House/Bulldog.hpp ):

namespace Street {
namespace House {
class Bulldog {};
}
}

然后,我有Bulldog.hpp

#include "House/Bulldog.hpp"    

namespace Street {
using House::Bulldog;
}

注意這是怎么回事:我注射的聲明Street::House::Bulldog命名空間StreetStreet::Bulldogusing聲明。

然后,我有Owner.hpp ,其中Bulldog類是向前聲明的

namespace Street {
class Bulldog;

class Owner {
  Bulldog* bulldog;
};
}

最后,我有Owner.cpp

#include "Owner.hpp"
#include "Bulldog.hpp"

namespace Street {
// Implementation of Owner...
}

Owner.cpp發生編譯錯誤:

error: 'Bulldog' is already declared in this scope

這種現象的自然解釋似乎是C ++將這兩個Bulldog類視為不同,但為什么呢? 在這種情況下,我看不出任何含糊之處,即如果編譯器正確實現,它實際上可以工作。

您能建議哪些變通方法? 我能想到的只是從Owner.hpp刪除Bulldog 前向聲明 ,並將#include "Bulldog.hpp"Owner.cpp移到Owner.hpp 但是,這將導致完全包含而不是前向聲明

看來你可以通過更改Bulldog.hpp來解決這個問題

namespace Street {
    namespace House {
        class Bulldog;
    }
    using House::Bulldog;

    // ...
}

這對Clang來說很有用。

你寫的Owner.hpp為:

namespace Street {
class Bulldog;

class Owner {
  Bulldog* bulldog;
};
}

本來應該是

namespace Street {
namespace House {
class Bulldog;
}

class Owner {
  House::Bulldog* bulldog;
};
}

你不小心向前聲明了Street::Bulldog ,它不是真正的類,而不是Street::House::Bulldog ,這一個真正的類。 因此,你在Owner.cpp中的實現Owner.cpp舒服,因為Bulldog*不明確。 它不知道你是指引用的類Street::Bulldog還是聲明的(也是定義的, 雖然編譯器並不關心它Street::House::Bulldog

由於您要轉發聲明的類是Street::House::Bulldog ,因此您需要在.hpp文件的聲明中包含第二個House命名空間。

暫無
暫無

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

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