【问题标题】:Why std::iterator is not able to access the function为什么 std::iterator 无法访问该函数
【发布时间】:2020-10-24 18:16:17
【问题描述】:

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

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() 不是 Director 类的成员。

【问题讨论】:

  • 这是一个operator precedence 问题。 *it-&gt;getName() 等于 *(it-&gt;getName())。你需要(*it)-&gt;getName()

标签: c++ vector stl c++14


【解决方案1】:

您正在使用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();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      相关资源
      最近更新 更多