2015-11-29 157 views
0

最近,我跑過一些代碼,看起來像這樣:分配一個非指針指針? (?子類在C++中的指針類型)

Foo<SomeType> member; 
... 
void SomeFunc(Bar* bar); 
... 
SomeFunc(member); 

,我發現它非常混亂。有人能解釋這裏究竟發生了什麼嗎?

memberBar*有效嗎?

Foo<SomeType>不知何故子類指針類型?

這是模板的某些屬性?如果memberFoo而不是Foo<SomeType>,還有可能嗎?

+1

您需要提供'Foo '的定義以獲得準確答案。也許它有一個隱式轉換。 – Downvoter

+0

你確定沒有'void SomeFunc(Foo foo);'某處? – YSC

回答

2

成員如何成爲有效的Bar *?

一種可能性是Foo<SomeType>可轉換爲Bar*。這可以通過在Foo<SomeType>中有user-defined conversion operator來實現。但我認爲這樣的操作返回的指針不會有任何意義。也許,如果Foo<SomeType>繼承Bar並且轉換運算符返回this它可能會做一些有意義的事情,但這會是多餘的和令人困惑的。

Foo莫名其妙地繼承了一個指針類型嗎?

不可以。您不能繼承基本類型。指針是基本類型。

這是模板的一些性質?

這還算是可能的,如果成員是Foo而不是Foo<SomeType>

否。類模板的實例是類。 Foo<SomeType>是一類。這不是Foo。變量不能將模板作爲類型。

+0

「這可以通過使用轉換構造函數來實現」。這是相反的方式。一個轉換構造函數使得它可以轉換*來自另一種類型。 –

+0

感謝您的回覆,轉換構造函數正是我一直在尋找的。爲了澄清最後一個問題,我應該寫下「如果member'是一些'Baz'而不是'Foo ''來澄清我在想,如果模板和這種行爲之間確實存在聯繫,沒有模板是可能的。無論如何,感謝您的及時回覆! – Solicasus

+0

@ n.m。真的,我原來犯的錯誤是,轉換是從'Bar *'轉換爲'Foo ',但是當我解決這個問題時,忘記了它會影響我的答案。 – user2079303