繁体   English   中英

类型映射...不提供呼叫操作员

[英]Type map… does not provide a call operator

尝试在 class 月份实现一些重载运算符:

class Month
{
      int monthNumber;
      string name;
}

我能够毫无问题地实现以下构造函数:

Month::Month(int cust_month) 
{
    monthNumber = cust_month;
    name = int_month.at(cust_month);
}

请注意使用 map(未显示) int_month 其中 int 1-12 映射到相应的月份名称,这工作正常。 但是在重载 ++ 运算符时尝试做类似的事情:

Month Month::operator++() {
    if (monthNumber == 12) {
        monthNumber = 1;
        name = "January";
    }
    else{
        ++monthNumber;
        name = int_month(monthNumber); // ERROR

    }
    return *this;
}

在上面的代码片段中,int_month 被突出显示并显示错误:

Type 'map<int, std::__1::string>' (aka 'map<int, basic_string<char, char_traits<char>, allocator<char> > >') does not provide a call operator

我读过类似的帖子,他们都解决了某种编程错误,但在阅读之后,我仍然不确定这个错误对我的代码意味着什么。 我不仅很好奇如何解决它,而且很好奇为什么使用 map 在我的构造函数中通过键分配值工作正常,但相同的过程无法重载运算符。

当您阅读错误时,它会准确地告诉您问题所在:

Type 'map<int, std::__1::string>' (aka 'map<int, basic_string<char, char_traits<char>, allocator<char> > >') does not provide a call operator

您有一个从 int 到 string 的 map,它不提供呼叫运算符。 这意味着没有 function std::map<...>::operator()(...) 所以你要做的是你应该 go 到像cppreference这样的引用,你会看到没有operator()

此外,您会看到有一个Element Access部分,它为您提供两个功能:

  • at :使用边界检查访问指定元素
  • operator[] : 访问或插入指定元素

这可以非常准确地告诉您存在哪些功能。 如果您更详细地检查这些,您还将看到function 签名,例如operator[]

T& operator[]( const Key& key );
T& operator[]( Key&& key );

这意味着您可以将右值或对左值的 const 引用传递给括号运算符。 还要仔细阅读文档和最后的代码示例,以意识到如果值尚不存在,则将值插入map (相反at如果元素不存在则会抛出)。

最后,一些用法示例:

std::map<int, std::string> m;
m[3] = "a"; // inserts "a" at position 3
std::cout << m[3]; // prints "a"
m[3] = "b"; // modifies the conetent at 3 to "b"
std::cout << m[3]; // prints "b"

m.at(3) = "c"; // modifies the content at 3 to "c"
std::cout << m[3]; // prints "b"

m.at(4) = "d"; // this will throw std::out_of_range

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM