C ++-错误-没有运算符“ []”与这些操作数匹配

时间:2019-07-10 00:39:45

标签: c++ c++11

我正在为一个存储代码的容器工作,该容器存储字符串并按字母顺序对其进行排序(认为这很有趣)。我一直在尝试放置“ []”运算符并将其分配给私有成员 words ,以便我可以访问该成员内部的任何数据或字符串。但是,我一直在解决无法解决的连续错误。它说:

No operator "[]" matches these operands. Operand types are std::shared_ptr<std::vector<std::string, std::allocator<std::string>>>[size_t]

以下是有关错误的一些代码(class.cpp中存在错误):

class.h

#pragma once

#include <memory>
#include <vector>
#include <string>
#include <iostream>


class sort
{
public:

//...


    sort(int i): words(std::make_shared<std::vector<std::string>>(i)) { } 

    std::shared_ptr<std::vector<std::string>> & operator [](size_t st);

//...

private:

    std::shared_ptr<std::vector<std::string>> words;
    std::string alpha = "abcdefghijklmnopqrstuvwxyz";

};

class.cpp

#include "sort.h"

#include <memory>
#include <vector>
#include <iostream>

//...

std::shared_ptr<std::vector<std::string>> & sort::operator[](size_t st) 
{

    return words[st]; //Error is defined at the brackets
}

//...

要注意的另一件事是,如果我用st除去括号,则错误消失了(显然不是我要实现的目标)。对此代码的任何帮助或修复,将不胜感激。

2 个答案:

答案 0 :(得分:2)

问题可能是因为wordsstd::shared_ptr,而不是std::vectorstd::shared_ptr::operator[]() is a C++17 thing(意味着它不会在C ++ 11中编译),即使那样,它也不会按照您认为的那样做:

  

返回值

     

对数组的第idx个元素的引用,即get()[idx]

然后,从get()'s documentation

  

std :: shared_ptr :: get

     

T * get()const noexcept; (直到C ++ 17)

     

element_type * get()const noexcept; (自C ++ 17起)

意味着get()返回一个指针。总之,这有效地使您的代码与以下内容相同:

std::vector<int>* ptr = nullptr; // Note that this data is probably  allocated some how...
// Then, later...
ptr[index];

那不是您想要的。从本质上讲,这等效于访问向量数组的第index个元素的功能(它比这复杂得多,但是我对指针和数组之间的技术区别还不了解,无法在此处正确地表达出来)。您想要的是这样的已取消引用指针的operator[]()

(*ptr)[index]; // Parenthesis for clarity. I don't think that they are technically necessary here.

这归结为:您(可能)想要的是std::shared_ptr's dereference operator

 return (*words)[st]; // again, parenthesis for clarity here.
                     // I don't think they are technically necessary here, either.

应该可以编译并执行您想要的操作。

编辑:感谢Remy Lebeau's answer,引起我注意的是您的函数原型也需要更改,因为(*words)[st]不是{{1 }},仅作为std::shared_ptr<std::vector<std::string>>。因此,改为将原型更改为此:

std::string

在cpp中:

std::string& operator [](size_t st);

答案 1 :(得分:2)

您的words成员不是数组或容器。它是std::shared_ptr,没有在C ++ 17之前定义的operator[](即使那样,您的代码仍然会错误地使用它)。这就是为什么您的operator[]无法编译的原因。

您有一个std::shared_ptr指向一个std::vector<std::string>对象,该对象存储在内存 1 中的其他位置。如果您希望operator[]访问该std::string中的std::vector值,则需要先引用该指针才能访问std::vector,然后可以调用它的operator[]。您需要将operator[]的返回值固定为单个std::string,而不是std::shared_ptr

1:为什么要使用指针?为什么不直接在您的类中将words声明为实际的std::vector对象? std::vector<std::string> words;

尝试以下方法:

class.h

#pragma once

#include <memory>
#include <vector>
#include <string>
#include <iostream>

class sort
{
public:

    //...

    std::string& operator [](size_t st);

    //...

private:

    std::shared_ptr<std::vector<std::string>> words;
    std::string alpha = "abcdefghijklmnopqrstuvwxyz";

};

class.cpp

#include "sort.h"

#include <memory>
#include <vector>
#include <iostream>

//...

std::string& sort::operator[](size_t st) 
{
    return (*words)[st];
}

//...