我得到以下編譯錯誤在我的一個類,使用gcc 3.4.5(MinGW的)曖昧:請求成員`...」是在G ++
src/ModelTester/CModelTesterGui.cpp:1308: error: request for member `addListener' is ambiguous
include/utility/ISource.h:26: error: candidates are: void utility::ISource<T>::addListener(utility::IListener<T>*) [with T = const SConsolePacket&]
include/utility/ISource.h:26: error: void utility::ISource<T>::addListener(utility::IListener<T>*) [with T = const SControlPacket&]
希望你可以看到, ISource<T>
是一個模板接口,它只是表明該對象可以是某個匹配類型爲IListener<T>
的對象的通道。所以讓我厭煩的是這個想法,即由於某些原因,當我可以說,功能不明確時,它們不是。對於不同輸入類型IListener<const SConsolePacket&>
和IListener<const SControlPacket&>
,addListener()
方法過載。的用法是:
m_controller->addListener(m_model);
凡m_model
是指向一個IRigidBody
對象,IRigidBody
僅從IListener< const SControlPacket& >
繼承和從IListener< const SConsolePacket& >
作爲健全性檢查絕對不是,我使用的doxygen生成類層次圖和doxygen同意我的說法IRigidBody
不是從IListener< const SConsolePacket& >
很明顯,我對C++中inheritence的理解並不完全正確。我的印象是IListener<const SControlPacket&>
和IListener<const SConsolePacket&>
是兩種不同類型的下方,該函數聲明
addListener(IListener<const SConsolePacket&>* listener)
和
addListener(IListener<const SControlPacket&>* listener)
聲明兩個單獨的函數做取決於兩個不同的東西(不同)輸入的不同類型的參數。此外,我的印象是指向IRigidBody
的指針也是指向IListener<const SControlPacket&>
的指針,通過調用addListener(m_model)
,編譯器應該明白我正在調用上述兩個函數中的第二個函數。
我甚至嘗試鑄造m_model
這樣的:
m_controller->addListener(
static_cast<IListener<const SControlPacket&>*>(m_model));
,但仍然得到這個錯誤。我不能在我的生活中看到這些功能是如何模糊的。任何人都可以解釋這個問題嗎?
P.S.我知道如何做這個給力的功能,是未曖昧:
m_controller->ISource<const SControlPacket&>::addListener(m_model);
我恰好覺得是非常unreadible,我不希望有這樣做。
編輯...只是開玩笑。這因爲它會導致鏈接錯誤顯然不能解決問題:
CModelTesterGui.cpp:1312: undefined reference to `utility::ISource<aerobat::SControlPacket const&>::addListener(utility::IListener<SControlPacket const&>*)'
SControlPacket和SConsolePacket之間的關係是什麼? – GRB 2009-08-21 16:59:28
請問爲什麼最後一行'm_controller-> ISource :: addListener(m_model);'消除了這個調用的歧義?如果函數超載,它們應該在同一個類中。這些職能在哪裏申報? –
2009-08-21 17:01:49
@GRB沒有關係。兩者都是從無到有的結果。 @litb我錯了。它使它編譯,但事實證明,當鏈接器去嘗試找到純虛擬的ISource <...> :: addListener(...)時,會導致鏈接錯誤。現在我很困惑。當你說聲明我假設你的意思是定義。它們被定義在來自IController的concerete類中。 – cheshirekow 2009-08-21 17:12:31