Visual Studio 2012 的 C++ 模板问题

标签 c++ templates visual-studio-2012

我目前正在阅读一本关于模板的书,它给出了以下示例:

#include <string>

// note: reference parameters
template <typename T>
inline T const& max (T const& a, T const& b)
{
    return  (a < b)  ?  (b) : (a);
}

int main()
{
    char* a="apple";
    char* p="peach"; 
    ::max(a,p);   // OK, BUT 
    ::max("apple","peach");//  <<<< ERROR IN VISUAL STUDIO 2012, WHY?
}

我不明白为什么 VS2012 说:

error C2440: 'return' : cannot convert from 'const char *' to 'const char (&)[6]'

有人可以给我解释一下吗? 书上说这个应该可以,不过是老书了,还在等新的。

最佳答案

问题是在第二种情况下,您 T const& 被推断为 const char(&)[6],这是对数组的引用6 个字符。

在 VS2012 中,当您使用 ?: 进行比较时,它会将数组引用衰减到 char*,这样就无法将其作为引用返回. GCC 4.7.2 没有表现出这种衰减(参见 https://ideone.com/yIBZWi )。

你能试试下面的不太紧凑的版本吗(我手头没有 VS2012)?它应该能够通过在返回中不一起使用 a 和 b 来避免衰减。

template <typename T>
inline T const& max (T const& a, T const& b)
{
    if(a<b)
       return b;
    else
       return a;
}

关于Visual Studio 2012 的 C++ 模板问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322517/

相关文章:

c++ - 重载函数,为什么当出现错误类型时它总是调用整数输入的函数

c++ - 将 std::string 拆分为 vector<string> 的正确方法

c++ - 关于C++中的iterator和const问题

c++ - 调用空类的构造函数真的会占用内存吗?

python - Django-CMS 模板 block

visual-studio-2012 - 在 axml Xamarin 中没有智能感知

c++ - 在字符串中使用单词迭代器

c++ - 为什么模板函数接收带有一维引用的二维数组,而普通函数不接收

c++ - visual studio 2012 编译时间

visual-studio - 无法控制 Visual Studio 中的启动项目