这段C++代码出了什么问题
What is wrong with this piece of C++ code?
我刚刚开始用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);
}
您的运算符无效。在stl对max的实现中,对比较函数有一个断言,即a < b
和b < a
都为true是不可能发生的。如果你想一想,这不应该真的发生。您的第二个函数没有这个问题,所以它可以工作。还要检查一下,如果你返回false,它会起作用。
它可能因为一些安全检查而失败(vs studio)。。
对于比较事物,C++标准要求比较正确:如果a < b
产生true,那么b < a
必须产生false。
Visual studio会进行一些内部检查(在为调试而构建时),以检查是否存在这种情况。然而,你的比较总是正确的,所以它不能正确工作。
除此之外:请描述确切的问题,并向我们展示您包含的内容。"string"本身并不是什么东西-std::string是由标准定义的,你可能在某个地方有using namespace std
,它消除了在字符串前面写std::的需要。-然而,这被认为是不好的,应该避免。
显然,总是返回true
的函数不是严格的弱排序。因此,max
的行为没有定义,编译器可以选择做它想做的任何事情。例如,它可能会让守护进程飞出你的鼻子。
如果使用稍后的返回值,则它是一个严格的弱排序,因此代码可以按预期工作。
附带说明一下,使用string*
进行无铅化。在C++中,您应该很少通过指针传递内容(更喜欢(通常是常量)引用),甚至很少使用new
,几乎从不使用delete
(这就是std::auto_ptr
(C++03)或std::unique_ptr
(C++11)的作用)。在字符串(和大多数其他STL容器)的特殊情况下,应该按值使用它,并且只用于传递给优化为常量引用的函数。
此代码与我的gdb(7.1)和g++(4.4.3)配合良好你能发布你的g++和gdb版本吗
如果在不同于编译系统的系统上执行二进制文件尝试强制静态链接并重新测试
此外,请发布调试时出现的错误
BTw:你也可以使用s1 > s2
lib运算符,工作非常好。
g++ -g -Wall source.cpp -static
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了