C++ const类方法是否阻止在类之外分配变量?

C++ const类方法是否阻止在类之外分配变量?,c++,c++11,C++,C++11,我已经通过删除“const”解决了让代码编译的问题。然而,为什么在这种特定情况下,我不能在const类方法中分配非类成员?它可能是课堂的一部分;但是,我不明白为什么 我有我的代码要编译,但我对这种情况感到困惑 下面是类中的一些声明 using twoDList = multimap<string,string>; twoDList SomeMultiMap; 使用twoDList=multimap; 双重列表多重映射; 这将在我取下“const”时起作用。或者至少是编译。不过,这

我已经通过删除“const”解决了让代码编译的问题。然而,为什么在这种特定情况下,我不能在const类方法中分配非类成员?它可能是课堂的一部分;但是,我不明白为什么

我有我的代码要编译,但我对这种情况感到困惑

下面是类中的一些声明

using twoDList = multimap<string,string>;
twoDList SomeMultiMap;
使用twoDList=multimap;
双重列表多重映射;
这将在我取下“const”时起作用。或者至少是编译。不过,这里我只是分配仅在此函数中声明的迭代器。顺便说一下,使用名称空间std

bool object::foo(string a, string b) const
{
    pair<object::twoDList::iterator,object::twoDList::iterator> wordRange;
    wordRange = SomeMultiMap.equal_range(a);

    object::twoDList::iterator it = wordRange.first;

    //...
    //...
    //...
}
bool对象::foo(字符串a、字符串b)常量
{
双字距;
wordRange=SomeMultiMap.equal_range(a);
object::twoDList::iterator it=wordRange.first;
//...
//...
//...
}
我希望这个函数在不删除常量的情况下编译,但它没有编译

编辑:这里是编译错误,我在linux命令行上使用它

g++ -g -DDEBUG -std=c++11 -c test1.cpp
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from test1.cpp:1:
/usr/include/c++/4.8/bits/stl_pair.h: In instantiation of ‘std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(std::pair<_U1, _U2>&&) [with _U1 = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _U2 = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _T1 = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _T2 = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]’:
test1.cpp:15:15:   required from here
/usr/include/c++/4.8/bits/stl_pair.h:188:10: error: no match for ‘operator=’ (operand types are ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ and ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’)
    first = std::forward<_U1>(__p.first);
          ^
/usr/include/c++/4.8/bits/stl_pair.h:188:10: note: candidates are:
In file included from /usr/include/c++/4.8/map:60:0,
                 from test1.cpp:2:
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&)
     struct _Rb_tree_iterator
            ^
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&’
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&)
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&’
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from test1.cpp:1:
/usr/include/c++/4.8/bits/stl_pair.h:189:11: error: no match for ‘operator=’ (operand types are ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ and ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’)
    second = std::forward<_U2>(__p.second);
           ^
/usr/include/c++/4.8/bits/stl_pair.h:189:11: note: candidates are:
In file included from /usr/include/c++/4.8/map:60:0,
                 from test1.cpp:2:
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&)
     struct _Rb_tree_iterator
            ^
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&’
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&)
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&’
makefile:10: recipe for target 'test1.o' failed
make: *** [test1.o] Error 1
g++-g-DDEBUG-std=c++11-c test1.cpp
在/usr/include/c++/4.8/bits/stl_algobase.h:64:0中包含的文件中,
从/usr/include/c++/4.8/bits/char_traits.h:39,
从/usr/include/c++/4.8/ios:40,
从/usr/include/c++/4.8/ostream:38,
从/usr/include/c++/4.8/iostream:39,
来自test1.cpp:1:
/usr/include/c++/4.8/bits/stl_pair.h:在“std::pair&std::pair::operator=(std::pair&)[with_U1=std::_Rb_tree_const_迭代器;_U2=std:_Rb_tree_const_迭代器;_T1=std:_Rb_tree_迭代器;_T2=std:_Rb_树迭代器]:
test1.cpp:15:15:从这里开始需要
/usr/include/c++/4.8/bits/stl_pair.h:188:10:错误:与“operator=”不匹配(操作数类型为“std::_Rb_tree_iterator”和“std:_Rb_tree_const_iterator”)
first=std::forward(u p.first);
^
/usr/include/c++/4.8/bits/stl_pair.h:188:10:注:候选项包括:
在/usr/include/c++/4.8/map:60:0中包含的文件中,
来自test1.cpp:2:
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:std:_Rb_tree_迭代器&std:_Rb_tree_迭代器::operator=(const std:_Rb_tree_迭代器&)
结构Rb树迭代器
^
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:参数1从“std::_Rb_tree_const_iterator”到“const std::_Rb_tree_iterator&”没有已知的转换
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:std:_Rb_tree_迭代器&std:_Rb_tree_迭代器::operator=(std:_Rb_tree_迭代器&)
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:参数1从“std::_Rb_tree_const_iterator”到“std:_Rb_tree_iterator&”的转换未知
在/usr/include/c++/4.8/bits/stl_algobase.h:64:0中包含的文件中,
从/usr/include/c++/4.8/bits/char_traits.h:39,
从/usr/include/c++/4.8/ios:40,
从/usr/include/c++/4.8/ostream:38,
从/usr/include/c++/4.8/iostream:39,
来自test1.cpp:1:
/usr/include/c++/4.8/bits/stl_pair.h:189:11:错误:与“operator=”不匹配(操作数类型为“std::_Rb_tree_iterator”和“std:_Rb_tree_const_iterator”)
秒=标准::前进(u p.秒);
^
/usr/include/c++/4.8/bits/stl_pair.h:189:11:注:候选项包括:
在/usr/include/c++/4.8/map:60:0中包含的文件中,
来自test1.cpp:2:
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:std:_Rb_tree_迭代器&std:_Rb_tree_迭代器::operator=(const std:_Rb_tree_迭代器&)
结构Rb树迭代器
^
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:参数1从“std::_Rb_tree_const_iterator”到“const std::_Rb_tree_iterator&”没有已知的转换
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:std:_Rb_tree_迭代器&std:_Rb_tree_迭代器::operator=(std:_Rb_tree_迭代器&)
/usr/include/c++/4.8/bits/stl_tree.h:157:12:注意:参数1从“std::_Rb_tree_const_iterator”到“std:_Rb_tree_iterator&”的转换未知
makefile:10:目标“test1.o”的配方失败
make:**[test1.o]错误1

编辑:更多编辑以修复范围运算符。此外,还添加了这样一个事实,即如果有帮助的话,我将使用namespace std。

在成员函数的参数列表之后添加一个
const
,承诺不会通过
this
指针更改类对象。
this
的类型变为
const ClassType*
,而不仅仅是
ClassType*
。(就像任何指向const的指针或对const的引用一样,这只意味着不能使用该指针或引用更改对象,而不是意味着该对象是永久常量或不能通过其他方式更改。)

说一个类对象被视为
const
意味着它的所有成员(除了任何标记的
mutable
)都被视为
const
。由于在成员函数定义中,普通的非静态成员名
N
实际上与
this->N
的意思相同,因此当函数声明在参数列表后有一个
const
时,以这种方式命名的成员将被视为
const

因此在
bool object::foo(string a,string b)const
内部,作为
对象的成员的名称
SomeMultiMap
被视为
const SomeMultiMap
。当
多重映射
对象表达式为
常量
时,给出
,或者仅当对象表达式不是
常量
时,给出

因此,这可能会起作用(取决于您以后需要做什么):


您可以编辑您的帖子以包含编译错误吗?
std::multimap
s
equal_range()
的重载不是
const
。如果最佳匹配是调用非
常量重载,那么代码将无法编译。通过将
对指定为
std::pair<twoDList::const_iterator,twoDList::const_iterator> wordRange;
wordRange = SomeMultiMap.equal_range(a);

twoDList::const_iterator it = wordRange.first;
auto wordRange = SomeMultiMap.equal_range(a);
auto it = wordRange.first;