了解C ++模板错误

时间:2010-02-08 15:30:31

标签: c++ templates stl

#include <iostream>
#include <cstring>
#include <string>

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

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

template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
    return max (max(a,b), c);  // error
}

int main ()
{
    ::max(7, 42, 68);     // OK

    const char* s1 = "frederic";
    const char* s2 = "anica";
    const char* s3 = "lucas";
    ::max(s1, s2, s3);    // ERROR

}

有人可以告诉我为什么这是一个错误吗?

6 个答案:

答案 0 :(得分:3)

当你说:

 max (max(a,b), c)

max(char*,char*)返回指针BY VALUE。然后,您返回对此值的引用。为了使这个工作,你应该让你的所有max()函数返回值而不是引用,正如我认为在你上一个问题的答案中建议的那样,或者使char *重载获取并返回对指针的引用。

答案 1 :(得分:1)

您将返回对临时的引用。 max的char*重载按值返回,但3-arg模板按引用返回。

我不知道你为什么会收到错误。我只对我的编译器(GCC)发出警告。我想如果你发布了错误文本,有人可以解决它。

答案 2 :(得分:1)

如果你真的想要返回一个引用,那么你必须修改第二个重载以返回引用。

char const* const & max (char const* const & a, char const* const & b)

答案 3 :(得分:1)

你的例子相当于这个,也许你会用这种方式看得更好:

int foo()
{
    return 0;
}

int const & bar()
{
    return foo(); // Reference to what???
}

答案 4 :(得分:0)

编译时,我得到:

maxtest.cpp: In function `const T& max(const T&, const T&, const T&) [with T = const char*]':
maxtest.cpp:29:   instantiated from here
maxtest.cpp:19: warning: returning reference to temporary

那是因为你正在返回对临时的引用(即,当函数的调用者可以检查其值时,你的对象不再存在)。这肯定是一个错误,但是,既然你说错误,我怀疑它不是你想要的错误。

Visual Studio中的一些标头#define min和max。为了解决这个问题,请将括号括在最小值和最大值附近:

return (max) ( (max) (a, b), c );

答案 5 :(得分:0)

gcc 4.2.1给出了关于返回对临时引用的警告,因此,更改代码以按值返回有帮助。

顺便说一句:我还将max重命名为my_max,因为<algorithm>已经定义了max

#include <iostream>
#include <cstring>
#include <string>

template <typename T>
inline T const my_max (T const& a, T const& b)
{
    return  a < b  ?  b : a;
}

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

template <typename T>
inline T const my_max (T const& a, T const& b, T const& c)
{
    return my_max (my_max(a,b), c);  // error
}

int main ()
{
    std::cout << my_max(7, 42, 68) << "\n"; // OK

    const char* s1 = "frederic";
    const char* s2 = "anica";
    const char* s3 = "lucas";
    std::cout << my_max(s1, s2, s3) << "\n"; // NO ERROR

}

gcc -Wall -Wextra file.cpp -o test没有警告或错误,输出为:

  

68
  卢卡斯