次のコードを印刷:ミキシングテンプレート関数のオーバーロードと継承
generic
overload
しかし、私が望んでいたことは、過負荷や専門がない一般的なもの、両方のケースで呼び出されたということです。私は、テンプレートの特殊化と過負荷を混在させようとはしていません。これを達成するためのテンプレートマジックはありますか?
#include <iostream>
class Interface {};
class Impl: public Interface {};
class Bar
{
public:
template<typename T> void foo(T& t) {
std::cout << "generic\n";
}
void foo(Interface& t) {
std::cout << "overload\n";
}
};
template<> void Bar::foo<Interface>(Interface& t) {
std::cout << "specialization\n";
}
int main() {
Bar bar;
Impl impl;
Interface& interface = impl;
bar.foo(impl);
bar.foo(interface);
return 0;
}
私が最初にこのコードを見たとき、私はGCCがそれが悪いと思うのと同じ理由でそれが悪いと思った。しかし、考え直しに、私は他のすべては –
@Johannes等しい場合非テンプレート関数が関数テンプレート特殊よりも一致しているので、これは、非テンプレートに解決すべきだと思う:あなたが解決策を知っていますか? 「他のすべてが等しい場合、」非テンプレートは、そのパラメータのいずれかのためのより悪いの変換を持っていない場合は、」言うべきので、それは本当ではない、とテンプレートは、そのパラメータのいずれかのためのより良い変換を持っていない: –
いいえ、私の上記のコメントを無視してください"私の非常に最初のコメントが言ったように、これは* *クリスクロスです:http://stackoverflow.com/questions/3519282/why-is-this-ambiguity-here/3525172#3525172、およびGCCは正しいです。 –