0

Является ли следующая специализация шаблоном функции-члена bar действительным? Он компилируется на gcc 4.5.3 и VS .NET 2008. Я смущен, потому что я смутно вспоминаю, что эти шаблоны функций не могут быть специализированными.Специализированный шаблон функции-члена класса без шаблона

struct Foo 
{ 
    template<typename T> 
    void bar(); 
}; 

template<typename T> 
void Foo::bar(){} 

template<> 
void Foo::bar<bool>(){} 

int main() 
{ 
    Foo f; 
    f.bar<char>(); 
    f.bar<bool>(); 
} 

ответ

3

Шаблон функции не может быть частично специализированным, но может быть специально специализированным, ваш код совершенно правильный.

0

Функциональный шаблон частичной специализации was considered in C++11 but was rejected поскольку перегрузка шаблона функции может быть использована для решения одной и той же проблемы. Тем не менее, есть some caveats, которые нужно искать при выполнении этого.

Пример:

template <typename T> void foo(T); 
void foo(int); 

foo(10); // calls void bar(int) 
foo(10.f); // calls void bar(T) [with T = float] 
foo(10u); // calls void bar(T) [with T = unsigned int]!! 

В вашем случае, что-то в этом роде может работать

struct Foo 
{ 
    template<typename T> 
    void bar(T dummy); 

    void bar(bool dummy); 
}; 

template<typename T> 
void Foo::bar(T dummy) { } 

void Foo::bar(bool dummy) { } 

int main() 
{ 
    Foo f; 
    f.bar('a'); 
    f.bar(true); 
} 
Смежные вопросы