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); 
}