【发布时间】:2015-12-14 11:48:33
【问题描述】:
让我们考虑以下代码:
template <typename T>
class Foo
{};
template <typename T, typename U>
class Foo<T(*)(U* const)>
{};
template <typename T, typename U>
class Foo<T(*)(U*)>
{};
当我尝试编译它(ideone) 时,它无法告诉我这两个模板特化是相同的。这令人惊讶,因为通常 U* 和 U* const 是不同的东西(第二个是 const 指针)。这里有什么问题?
【问题讨论】:
-
签名相同。函数参数的顶级限定符从签名中默默地删除。也许你想要
U const *? -
@n.m.它们并没有什么不同:我可以做
Foo<U* const>和Foo<U*>专业化就好了。实际上我想要U const *和U * const(以及U const * const)。 -
U*和U* const的类型不同,但T(U*)和T(U* const)是一样的。您不能重载它们,因为它们是相同的签名。目前还不清楚这可能有什么用途。这与重载int func(int)和int func(const int)相同。干什么用的? -
只是为了说明:即使没有模板,您也不能同时拥有
void foo(int)和void foo(const int)。这是一个错误:error: redefinition of 'void foo(int)' -
通过参数的常量重载没有意义。但这与函数重载无关,不是吗?我想为两个不同的功能(具有不同的名称)使用两种不同的专业化。
标签: c++ templates constants function-pointers