【问题标题】:explicit specialization of template模板的显式特化
【发布时间】:2017-06-10 10:24:11
【问题描述】:

这是我的函数模板

template<class T> const T& min(const T& a, const T& b) {
return (a < b) ? a : b;
}

函数的唯一目的是返回两个参数的最小值。参数是只读的..

这里是 char* 参数的显式特化

//Code 1:
    template<>
    const char*& min<const char*>(const char* &a,
    const char* &b) {
    return (strcmp(a, b) < 0) ? a : b;
    }

即使有只读参数,此代码也会出错。虽然下面的代码完美运行

//Code 2:    
template<>
    const char* const& min<const char*>(const char* const& a,
    const char* const& b) {
    return (strcmp(a, b) < 0) ? a : b;
    }

如果单独使用 &const 就足够了,为什么我必须在 char* 之后提供 const&参数只读。 Code 2..中的const&是什么意思??

已编辑:

我在使用代码 1 编译时收到此错误代码..

error: template-id 'min<const char*>' for 'const char* const& min(const char*&, const char*&)' does not match any template declaration|

虽然使用 Code 2 编译没有错误代码..

【问题讨论】:

  • 看这里(c,但答案在这里有效):stackoverflow.com/questions/890535/…
  • 您已将模板参数声明为参考 (T&amp;)。那么你为什么想知道你必须在专业化中保持这样的状态呢?你能详细说明你的疑问吗?
  • 是的,但是为什么要使用 const& 当你可以单独使用 'const' 或 'reference operator (&)' 来确保指针总是指向同一个地址时......
  • @abhi_awake "或者单独的'引用运算符 (&)'" 咦,什么??
  • const char* &amp; 是对const char* 的非常量引用,而不是对char* 的常量引用。它不是const T&amp; 的特化。 (并且您对返回值和参数使用不同的类型。)

标签: c++ c++11


【解决方案1】:

在你的第一个声明中

template<class T> const T& min(const T& a, const T& b) {...}

const T&amp; 实际上等价于T const &amp;,即对常量T 的引用。如果你想专门化那个函数,它仍然需要获得一个对常量something的引用。如果您想专门针对const char*(与char const * 相同,即指向常量char 的指针),则需要编写:char const * const &amp;,即对指向a 的常量指针的引用常量char

一般来说,const 总是指写在它左边的任何东西,只有当const 本身在最开始时,它才会指代写在它右边的东西。

附录(题外话,这并不能说明实际问题):

您可以重载min,而不是模板特化:

const char* min(const char* a, const char* b) {
    return (strcmp(a, b) < 0) ? a : b;
}

【讨论】:

  • @abhi_awake 请正确的英语。即使在 cmets 中。
  • @πάνταῥεῖ 抱歉,给您带来的不便
【解决方案2】:

char* 实际上有 2 个不同的专业。

第一个签名

const char* const& min<const char*>(const char* &a,
const char* &b)

使指向的值只读。而第二个

const char* const& min<const char*>(const char* const& a,
const char* const& b)

也使指针参数为只读。
第一个签名将允许更改从函数内部作为参数传递的指针。

【讨论】:

  • 编译器在第一个代码上给出错误...这就是令人困惑的地方..为什么我们不能使用第一个代码
  • @abhi_awake 请将逐字错误消息放入您的问题中。这可能是因为您的第一个签名使用与模板中指定的类型不同的类型作为返回类型。
  • error: template-id 'min' for 'const char* const& min(const char*&, const char*&)' 不匹配任何模板声明
  • @abhi_awake 我说的是put it into your question!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多