[英]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
命名空間Street
為Street::Bulldog
與using
聲明。
然后,我有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.