我是c ++模板的新手。 我正在尝试一些小程序。
CPP [80]> cat 000001.cpp 000001.hpp
#include <iostream>
#include <string>
#include "000001.hpp"
int main()
{
int i = 42;
std::cout << "max(7,i): " << ::max(7,i) << std::endl;
double f1 = 3.4;
double f2 = -6.7;
std::cout << "max(f1,f2): " << ::max(f1,f2) << std::endl;
std::string s1 = "mathematics";
std::string s2 = "math";
std::cout << "max(s1,s2): " << ::max(s1,s2) << std::endl;
}
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
当我编译这个程序时:
我收到以下错误:
CPP [78]> /opt/aCC/bin/aCC -AA 000001.cpp
Error (future) 229: "/opt/aCC/include_std/string.cc", line 164 # "Ambiguous overloaded function call; a
function match was not found that was strictly best for ALL arguments. Two functions that matched
best for some arguments (but not all) were "const unsigned long &max<unsigned long>(const unsigned
long &,const unsigned long &)" ["000001.hpp", line 2] and "const unsigned long &std::max<unsigned
long>(const unsigned long &,const unsigned long &)" ["/opt/aCC/include_std/algorithm", line 1762]."
Choosing "const unsigned long &max<unsigned long>(const unsigned long &,const unsigned long &)"
["000001.hpp", line 2] for resolving ambiguity.
_C_data = _C_getRep (max (_RW::__rw_new_capacity (0, this),
^^^
Warning: 1 future errors were detected and ignored. Add a '+p' option to detect and fix them before they become fatal errors in a future release. Behavior of this ill-formed program is not guaranteed to match that of a well-formed program
请问你能告诉我究竟是什么错误吗?
答案 0 :(得分:7)
您可能在某处包含<iostream.h>
而不是<iostream>
。前者现在已经存在一段时间了,但出于兼容性原因,编译器仍然接受include并将其替换为
#include <iostream>
using namespace std;
这会导致std::max
被带到全局命名空间,从而导致歧义。将<iostream.h>
替换为<iostream>
或重命名max
功能,问题就会消失。
编辑:您显然修复了包含,但我打赌您仍然在某处using namespace std;
。你需要摆脱它。实际上,您不应该在全局范围内使用using namespace
。
修改:某处可能还有using std::max
。你也需要摆脱它。
答案 1 :(得分:1)
您发布的代码编译得很好,“000001.hpp”中必定还有其他错误。你也可以发布该文件的内容吗?
编辑:如果您按照avakar所说,但问题仍然存在,那一定是由于您的编译器出现问题。我可以想到两种明显的解决方法:将max
函数重命名为其他函数,或将其放在命名空间中:
namespace Foo
{
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
}
int main()
{
int i = 42;
std::cout << "max(7,i): " << Foo::max(7,i) << std::endl;
double f1 = 3.4;
double f2 = -6.7;
std::cout << "max(f1,f2): " << Foo::max(f1,f2) << std::endl;
std::string s1 = "mathematics";
std::string s2 = "math";
std::cout << "max(s1,s2): " << Foo::max(s1,s2) << std::endl;
}
答案 2 :(得分:1)
我不知道您使用的是哪个编译器,但第二个错误告诉您以下两个函数发生冲突:
::max
std::max
看起来很奇怪,你可能会在某个地方或更糟的地方using namespace std;
,你的其中一个使用iostream.h
,如第一个错误中所述。您能否提供有关编译器/工具链和.hpp文件内容的更多信息?
答案 3 :(得分:0)
它说
的两个定义max<unsigned long>
找到了。一个定义在000001.hpp中,另一个定义在/ opt / aCC / include_std / algorithm中。编译器现在选择000001.hpp中的那个,因此现在不存在错误。但它说这两个定义可能会在将来导致错误。
答案 4 :(得分:0)
我不知道这是否会导致问题,但无论如何;你不应该使用名称max作为全局(或本地)函数,因为它是STL的一部分。