为什么 std::itrator 无法访问该函数

Why std::iterator is not able to access the function

本文关键字:访问 函数 std itrator 为什么      更新时间:2023-10-16

当我尝试通过迭代器访问函数时,编译会告诉该类没有具有此名称的成员。

class Director
{
private:
std::string stdstrName;
public:
Director(std::string name): stdstrName(name){ }
void setName(std::string name) { stdstrName = name; }
std::string getName() { return stdstrName; }
};
int main(){    
std::vector<std::shared_ptr<Director>> stdVecDir;
std::shared_ptr<Director> pointer1 = std::make_shared<Director>("Director1");
std::shared_ptr<Director> pointer2 = std::make_shared<Director>("Director2");
std::shared_ptr<Director> pointer3 = std::make_shared<Director>("Director3");
stdVecDir.push_back(pointer1);
stdVecDir.push_back(pointer2);
stdVecDir.push_back(pointer3);
auto it = std::find(stdVecDir.begin(), stdVecDir.end(), [](std::shared_ptr<Director> dir) { return dir->getName() == "Director2"; });
if (it != std::end(stdVecDir))
std::cout << *it->getName();  // compiler complains that getName() is not a member of class Director
}

为什么编译抱怨 getName(( 不是类控制器的成员。

您正在使用std::find(),但它与值一起使用,而不是与可调用对象一起使用,因此您需要使用std::find_if

并且您正在使用迭代器来访问由迭代器指向的指针指向的对象的成员函数,因此您有两个取消引用,而不是一个。

以下是更正

auto it = std::find_if(stdVecDir.begin(), stdVecDir.end(),
[](std::shared_ptr <Director> dir) { return dir->getName() == "Director2"; });
if (it != std::end(stdVecDir))
std::cout << it->get()->getName(); //or (*it)->getName();

如果我没记错的话,您需要将其更改为(*it(->才能从迭代器和shared_ptr访问Director。使用 *it->您可以从迭代器访问shared_ptr。