У меня есть шаблон функции, который я специализировал для определенного типа. У меня возникли проблемы с получением специализированной версии в определенных обстоятельствах. Для иллюстрацииСпециализация шаблона функции, не вызываемая для производного типа
struct Base {};
struct Derived : public Base {};
template <typename VALTYPE> void FooInternal(VALTYPE&)
{
std::cout << L"FooInternal template";
}
template<> void FooInternal(Base&)
{
std::cout << L"FooInternal SPECIAL";
}
Теперь, если я построить экземпляр «базы» или «производный» и называем «FooInternal», все работает, как я ожидал бы
int _tmain(int argc, _TCHAR* argv[])
{
int x = 7;
FooInternal(x); // Calls FooInternal<VALTYPE>() template
Base b;
FooIntenral(b); // Calls FooInternal<Base>() specialization
Derived d;
FooInternal(d); // Calls FooInternal<Base>() specialization
return 0;
}
Выход этого
FooInternal template
FooInternal SPECIAL
FooInternal SPECIAL
}
Но предположим, что у меня есть промежуточный шаблон функции между этими двумя, что вызывает Foo Внутренний. В этом случае разрешение шаблон для производного типа, кажется, не в состоянии по пути
// Intermediate template. Just calls FooInternal.
template<typename VALTYPE>
void Foo(VALTYPE& val)
{
FooInternal<VALTYPE>(val);
}
// Now repeat the same 3 calls and see what happens with Derived...
int _tmain(int argc, _TCHAR* argv[])
{
int x = 7;
Foo(x); // Calls FooInternal<VALTYPE>() template
Base b;
Foo(b); // Calls FooInternal<Base>() specialization
Derived d;
Foo(d); // Calls FooInternal<VALTYPE>() template!!!
return 0;
}
Вывод этой программы
FooInternal template
FooInternal SPECIAL
FooInternal template
Я не могу понять, почему - в 3-й вызов " Foo "не будет вызывать специализированную версию FooInternal, как это было, когда вызов был прямым. Разве компилятор не понимает, что это происходит от «Базы» в этом случае? Какое правило я пропущу здесь?
Я использую обновление Microsoft Visual Studio 2012 Update 3, если это имеет значение.
-Joe
С тегом [C++] вы получите больше внимания и ** подсветку синтаксиса **. – dyp
У вас есть явная (полная) специализация для 'Base &', тогда как тип, который вы используете в явной спецификации, используемой для вызова 'FooInternal', это' Derived', а не 'Base'. – dyp
Я понимаю, что я использую Derived в этом вызове. Но это не объясняет, почему это работает, когда я вызываю FooInternal напрямую с Derived. Не следует ли вызвать тот факт, что Foo приводит к тому, что компилятор делает такое же разрешение, когда я вызывал Foo напрямую? – user2057722