다음 코드를 인쇄 :혼합 템플릿 함수 오버로드 및 상속
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는 정확합니다. –