c – 功能模板专用化格式

第二个括号<>的原因是什么?在以下功能模板中:

template<> void doh::operator()<>(int i)

这发生在SO question,在那里建议有在括号后缺少operator(),但是我找不到解释。

我理解的意思,如果它是一种类型专业化(完全专业化)的形式:

template< typename A > struct AA {};
template<> struct AA<int> {};         // hope this is correct, specialize for int

但是对于功能模板:

template< typename A > void f( A );
template< typename A > void f( A* ); // overload of the above for pointers
template<> void f<int>(int);         // full specialization for int

这在哪里适合这个场景?:

template<> void doh::operator()<>(bool b) {}

示例代码似乎工作,不给任何警告/错误(gcc 3.3.3使用):

#include <iostream>
using namespace std;

struct doh
{
    void operator()(bool b)
    {
        cout << "operator()(bool b)" << endl;
    }

    template< typename T > void operator()(T t)
    {
        cout << "template <typename T> void operator()(T t)" << endl;
    }
};
// note can't specialize inline, have to declare outside of the class body
template<> void doh::operator()(int i)
{
    cout << "template <> void operator()(int i)" << endl;
}
template<> void doh::operator()(bool b)
{
    cout << "template <> void operator()(bool b)" << endl;
}

int main()
{
    doh d;
    int i;
    bool b;
    d(b);
    d(i);
}

输出:

operator()(bool b)
template <> void operator()(int i)
我查了一下,发现它是由14.5.2 / 2指定:

A local class shall not have member templates. Access control rules (clause 11) apply to member template names. A destructor shall not be a member template. A normal (non-template) member function with a given name and type and a member function template of the same name, which could be used to generate a specialization of the same type, can both be declared in a class. When both exist, a use of that name and type refers to the non-template member unless an explicit template argument list is supplied.

并提供了一个例子:

template <class T> struct A {
    void f(int);
    template <class T2> void f(T2);
};

template <> void A<int>::f(int) { } // non-template member
template <> template <> void A<int>::f<>(int) { } // template member

int main()
{
    A<char> ac;
    ac.f(1); //non-template
    ac.f(’c’); //template
    ac.f<>(1); //template
}

注意,在标准术语中,专门化是指使用显式专门化写入的函数,以及使用实例化生成的函数,在这种情况下,我们必须使用生成的专门化。专业化不仅指使用显式专门化模板创建的函数,而且通常只使用它。

结论:GCC错了。 Comeau,我也测试了代码,得到它的权利,并发出诊断:

"ComeauTest.c", line 16: error: "void doh::operator()(bool)" is not an entity that
can be explicitly specialized
template<> void doh::operator()(bool i)

注意,它不是抱怨模板的int(仅用于bool)的专业化,因为它不引用相同的名称和类型:专业化将具有的函数类型是void(int),这是不同的从非模板成员函数的函数类型,即void(bool)。

http://stackoverflow.com/questions/937744/function-template-specialization-format

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 功能模板专用化格式