在Visual Studio 2008中,編譯器無法解析調用SetCustomer
以下_tmain
,使其明確:曖昧訪問基類模板成員函數
template <typename TConsumer>
struct Producer
{
void SetConsumer(TConsumer* consumer) { consumer_ = consumer; }
TConsumer* consumer_;
};
struct AppleConsumer
{
};
struct MeatConsumer
{
};
struct ShillyShallyProducer : public Producer<AppleConsumer>,
public Producer<MeatConsumer>
{
};
int _tmain(int argc, _TCHAR* argv[])
{
ShillyShallyProducer producer;
AppleConsumer consumer;
producer.SetConsumer(&consumer); // <--- Ambiguous call!!
return 0;
}
這是編譯錯誤:
// error C2385: ambiguous access of 'SetConsumer'
// could be the 'SetConsumer' in base 'Producer<AppleConsumer>'
// or could be the 'SetConsumer' in base 'Producer<MeatConsumer>'
我認爲模板參數查找機制足夠聰明,可以推導出正確的基地Producer
。爲什麼不是?
我能解決這個問題,通過改變Producer
到
template <typename TConsumer>
struct Producer
{
template <typename TConsumer2>
void SetConsumer(TConsumer2* consumer) { consumer_ = consumer; }
TConsumer* consumer_;
};
,並呼籲SetConsumer
作爲
producer.SetConsumer<AppleConsumer>(&consumer); // Unambiguous call!!
,但如果我沒得還要好......
我只是想指出在你提出的解決方法中,你不需要調用'SetConsumer(&consumer)','SetConsumer(&consumer)'就足夠了(並且正確地推導出模板參數)。 –
sbk
2010-04-26 12:51:27
@sbk:不,它不會。我在發佈之前嘗試過,現在再次確定。仍然含糊不清。 – 2010-04-26 13:19:55