gpt4 book ai didi

c++ - 函数模板特化格式

转载 作者:IT老高 更新时间:2023-10-28 12:43:33 25 4
gpt4 key购买 nike

下面函数模板中第二个括号<>是什么原因:

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
}

请注意,在标准术语中,specialization指使用显式特化编写的函数和使用实例化生成的函数,在这种情况下,我们必须处理生成的特化。 specialization不仅仅指您使用显式特化模板创建的函数,它通常仅用于该模板。

结论: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) .

关于c++ - 函数模板特化格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com