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

2 回答 2

3

函数模板不能部分特化,但可以显式特化,您的代码完全正确。

于 2014-01-13T11:59:20.800 回答
0

在 C++11 中考虑了函数模板部分特化,但由于函数模板重载可用于解决相同问题而被拒绝。但是,在执行此操作时需要注意一些注意事项。

例子:

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);
}
于 2014-01-13T12:04:50.843 回答