【发布时间】:2011-02-12 09:05:24
【问题描述】:
在 Visual Studio 2008 中,编译器无法解析下面_tmain 中对SetCustomer 的调用并使其明确:
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<AppleConsumer>(&consumer),SetConsumer(&consumer)就足够了(并正确推断出模板参数)。 -
@sbk:不,不会。我在发布之前尝试过,现在再次确定。仍然模棱两可。