Я давно смотрю на это. Я не понимаю, что беспокоит это. Минимальный код, который дает мне проблему, показан ниже. Я комментирую строку, где происходит ошибка. После кода следуют ошибки компиляции.
#include <map>
#include <cstdlib>
#include <cstdint>
template<std::size_t D>
class myclassA{
private:
std::array<std::string, D> a;
std::map<std::string, std::size_t> a_type_num;
std::array<std::size_t, D> a_dims;
// used to initialize a_type_num
inline std::map<std::string, std::size_t> return_type_dims() const{
std::map<std::string, std::size_t> temp;
for(auto const &s: a)
temp.emplace(s, 0);
for(auto const &s: a)
temp[s]++;
return temp;
};
// used to initialize a_dims
inline std::array<std::size_t, D> return_site_dims() const{
std::array<std::size_t, D> temp;
for(int i=0; i<D; i++)
temp[i] = a_type_num[a[i]]; // ERROR!!!
return temp;
};
public:
// constructor
myclassA(const std::array<std::string,D> &user) : a(user)
, a_type_num(return_type_dims())
, a_dims(return_site_dims())
{};
};
int main(int argc, char *argv[]){
myclassA<4> co({"d","d","p","p"});
return 0;
}
При компиляции я получаю ошибку:
src/main.cpp(32): error: no operator "[]" matches these operands
operand types are: const std::map<std::__cxx11::string, std::size_t, std::less<std::__cxx11::string>, std::allocator<std::pair<const std::__cxx11::string, std::size_t>>> [ const std::__cxx11::string ]
temp[i] = a_type_num[a[i]];
^
detected during:
instantiation of "std::array<std::size_t={unsigned long}, D> myclassA<D>::return_site_dims() const [with D=4UL]" at line 40
instantiation of "myclassA<D>::myclassA(const std::array<std::__cxx11::string, D> &) [with D=4UL]" at line 45
С другой стороны, что-то вроде этого компилируется нормально (я имею в виду, что код собирается ничего не делать, но он компилируется):
#include <map>
#include <cstdlib>
#include <cstdint>
int main(int argc, char *argv[]){
// myclassA<4> co({"d","d","p","p"});
std::array<std::string, 10> a;
std::map<std::string, std::size_t> a_type_num;
std::array<std::size_t, 10> temp;
for(int i=0; i<10; i++)
temp[i] = a_type_num[a[i]];
return 0;
Итак, мой вопрос: почему он жалуется, что no operator "[]" matches these operands
?