我刚开始用C ++编程,我正在玩模板。
以下代码在运行时失败,我不知道为什么。 (请注意,它只是一个示例代码,未在生产中使用)
bool maxCompare(string* s1,string* s2){
cout<<*s1<<endl;
cout<<*s2<<endl;
return true; //If I comment this line and instead use the line below, it works fine.
//return *s1 < *s2;
}
int main()
{
string* s1=new string("Hello");
string* s2=new string("Hi");
string *s3= max(s1,s2,maxCompare);
}
答案 0 :(得分:4)
由于某些安全检查(由vs studio),它可能会失败。
为了比较事物,C ++标准要求比较正常工作:如果a < b
得到真,那么b < a
必须产生错误。
Visual Studio进行一些内部检查(构建调试时)以检查是否是这种情况。但是,您的比较将始终为true,因此无法正常工作。
除此之外:请描述确切的问题,并向我们展示您所包含的内容。 “string”不是自己的东西 - std :: string是由标准定义的,你可能在某处有using namespace std
,这就不需要在字符串前面编写std ::。 - 然而,这被认为是不好的,应该避免。
答案 1 :(得分:4)
您的运营商无效。在stl的max实现中,有一个比较函数的断言,a < b
和b < a
都是真的,它永远不会发生。如果你想到这一点,这应该永远不会发生。你的第二个功能没有这个问题所以它的工作原理。同时检查如果你返回false,它将起作用。
答案 2 :(得分:4)
显然,返回true
的函数并不是严格的弱序。因此,max
的行为未定义,编译器可能会选择执行任何操作。例如,它可以让守护进程从你的鼻子里飞出来。
如果使用后面的返回值,则它是严格的弱排序,因此代码按预期工作。
在旁注中,使用string*
取消学习。在C ++中,你应该很少通过指针传递东西(更喜欢(通常是常量)引用),更少使用new
并且几乎从不使用delete
(这就是std::auto_ptr
(C ++) 03)或std::unique_ptr
(C ++ 11)是为了)。在字符串(以及大多数其他STL容器)的特殊情况下,您应该按值使用它,并且只传递给函数优化到const引用。
答案 3 :(得分:0)
此代码适用于我的gdb(7.1)和g ++(4.4.3)
你可以发布你的g ++和gdb版本吗?
如果在与编译系统不同的系统上执行二进制文件
尝试强制静态链接并重新测试
另外请发布调试时出现的错误
BTw:你也可以使用
s1 > s2
lib运算符完美无缺。
g++ -g -Wall source.cpp -static