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