当出现编译错误:将'const x'作为'x'的'this'实参时丢弃了类型限定 问题时,需要根据源代码来分析原因和寻找解决办法,
下面两个实例给出了出现这种错误的两个案例及解决办法,仅供参考。
实例一:
########## a.h ##########
class A
{
public:
size_t size()
{ return size; }
private:
size_t size;
}
########## main.cpp ########
#include "stdio.h"
#include "a.h"
void print( const A & a)
{
cout << a.size() << endl;
}
int main(ing argc,char *argv[])
{
A a;
print(a);
}
错误:将'const x'作为'x'的'this'实参时丢弃了类型限定。
解决:这是由于print()传递的是const参数,而A::size()不保证传递的实参不改变,所以报错(STL机制问题)。应该吧size()声明为const函数,以保证编译通过。
size_t size() 函数变为: size_t size() const 即可。
实例二
编译错误: 将'const x'作为'x'的'this'实参时丢弃了类型限定。 这样的错误一般是因为const限定符的问题。如:
#include <cctype>
#include <string>
#include <set>
#include <iostream>
using namespace std;
class A
{
public:
string m_str;
A(string str){m_str = str;}
string ToString() {return m_str;}
bool operator<(const A &rhs) const {return true;} //为了能使用set
};
void output(const string &str)
{
cout<<str<<endl;
}
int main()
{
A a("dfsfsd");
output(a.ToString());
set<A> strset;
strset.insert(a);
output(strset.begin()->ToString());
return 0;
}
在使用g++编译时会出现如下错误:
test.cpp: In function ‘int main()’:
test.cpp:28: 错误:将 ‘const A’ 作为 ‘std::string A::ToString()’ 的 ‘this’ 实参时丢弃了类型限定
出现错误的原因是因为STL在指向set的内容时为const类型(是不可更改的),所以strset.begin()其实对应的是一个const A类型,而ToString()方法不能保证这strset.begin()所指向的内容不被改变。因此,应当将此ToString()方法显式声明为const方法,通知编译器此方法不会改变A的内容。修改后的class A:
class A
{
public:
string m_str;
A(string str){m_str = str;}
string ToString() const {return m_str;}
bool operator<(const A &rhs) const {return true;}
};