我正在为一个存储代码的容器工作,该容器存储字符串并按字母顺序对其进行排序(认为这很有趣)。我一直在尝试放置“ []”运算符并将其分配给私有成员 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
除去括号,则错误消失了(显然不是我要实现的目标)。对此代码的任何帮助或修复,将不胜感激。
答案 0 :(得分:2)
问题可能是因为words
是std::shared_ptr
,而不是std::vector
。 std::shared_ptr::operator[]()
is a C++17 thing(意味着它不会在C ++ 11中编译),即使那样,它也不会按照您认为的那样做:
返回值
对数组的第idx个元素的引用,即get()[idx]
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];
}
//...