const 类方法是否阻止在类外部分配变量?
Do const class methods prevent assigning variables outside of the class?
我已经解决了通过删除"const"来编译此代码的问题。但是,为什么在这种特定情况下,我似乎无法在 const 类方法中分配非类成员?它可能是类的一部分;虽然,我不明白为什么。
我得到了我的代码来编译,但我对这种情况感到困惑。
下面是类中的一些声明。
using twoDList = multimap<string,string>;
twoDList SomeMultiMap;
当我取下"康斯特"时,这将起作用。或者至少编译。不过,这里我只是分配仅在此函数中声明的迭代器。顺便说一下,使用命名空间标准。
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;
//...
//...
//...
}
我希望这个函数在不删除 const 的情况下编译,但它没有编译。
编辑:这是编译错误,我在 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
编辑:更多编辑以修复范围运算符。另外,添加了我正在使用命名空间 std 的事实,如果有帮助的话。
成员函数参数列表后面的const
是承诺不通过this
指针更改类对象。this
的类型变得const ClassType*
而不仅仅是ClassType*
。 (像任何指向常量的指针或对常量的引用一样,这仅意味着不能使用该指针或引用更改事物,而不是对象是永久的常量或不能通过其他方式更改。
说一个类对象被视为const
意味着它的所有成员(任何标记的mutable
除外)都被视为const
。 由于在成员函数定义中,纯非静态成员名实际上N
与this->N
相同,因此当函数声明在参数列表后具有const
时,以这种方式命名的成员被视为const
。
所以在bool object::foo(string a, string b) const
内部,作为object
成员的SomeMultiMap
这个名字,被当作const SomeMultiMap
。equal_range
在multimap
对象表达式const
时给出pair<const_iterator, const_iterator>
,或者仅在对象表达式未const
时给出pair<iterator, iterator>
。
所以这可能会起作用(取决于你之后需要做什么):
std::pair<twoDList::const_iterator,twoDList::const_iterator> wordRange;
wordRange = SomeMultiMap.equal_range(a);
twoDList::const_iterator it = wordRange.first;
(请注意,您通常不需要object::
前缀,因为成员函数体在其类的范围内。
尽管我只会用auto
来定义这些变量,但避免了完全正确获取类型的需要,并节省了键入那些长迭代器名称的时间。
auto wordRange = SomeMultiMap.equal_range(a);
auto it = wordRange.first;
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 通过外部分配的数据调用特征 GEMM
- C++ 在类外部分配 char 数组的索引
- const 类方法是否阻止在类外部分配变量?
- 外部 RAM 中的动态矢量分配
- 读取外部文件并在类似xml的输入中分配变量
- 在名称空间之外的C 中的外部变量分配值
- 外部具有动态分配的嵌套类中的类
- Qt4,QPainterPath的直接分配不起作用(未解决的外部)
- 如何在构造函数外部分配 Boost 的情况下序列化大型错误定位浮点数组?
- 自动释放由外部api分配的对象
- 调用一个外部C++函数,Memory Leaks:将在完成Python脚本后清理所有分配的内存
- C++ 使用外部参数分配具有'compound names'变量
- 正确设置外部指针分配内存在c++中