我有一个函数,它将一个指向字符串的指针作为参数。我想找到该字符串的子字符串,但我尝试使用use *str.substr()
但它说我正在尝试调用成员函数substr()
而str
不是类{{} 1}}我该怎么办?
std:string*
以上是代码的gyst。
答案 0 :(得分:3)
您正在考虑运算符优先级规则,这意味着您的代码将被读取为
*(str.substring(int, int));
您可以使用指针取消引用运算符->
str->substring(a, b);
或使用括号明确表达您想要的内容
(*str).substring(int, int);
除非参数可以为null,否则更简单的解决方案是传递引用:
foo(const std::string& str){
std::string temp = str.substring(a, b);
}
答案 1 :(得分:1)
归功于operator precedence。元素选择运算符.
的优先级高于解除引用运算符*
,因此编译器实际上将其视为
*(str.substr(...))
有几种方法可以解决这个问题。我建议的是不使用指针,而是引用参数。然后,您不必担心解除引用或可能的空指针。如果你不想修改原始字符串,那么就是一个常量引用。
像
void foo(const std::string& str)
{
// ...
std::string temp = str.substr(...);
// ...
}
然后在没有地址操作符
的情况下调用它std::string str = ...;
foo(str);