오류 : xxx를 'this'인수로 xxx를 전달하면 한정자를 버립니다.
#include <iostream>
#include <set>
using namespace std;
class StudentT {
public:
int id;
string name;
public:
StudentT(int _id, string _name) : id(_id), name(_name) {
}
int getId() {
return id;
}
string getName() {
return name;
}
};
inline bool operator< (StudentT s1, StudentT s2) {
return s1.getId() < s2.getId();
}
int main() {
set<StudentT> st;
StudentT s1(0, "Tom");
StudentT s2(1, "Tim");
st.insert(s1);
st.insert(s2);
set<StudentT> :: iterator itr;
for (itr = st.begin(); itr != st.end(); itr++) {
cout << itr->getId() << " " << itr->getName() << endl;
}
return 0;
}
줄을 :
cout << itr->getId() << " " << itr->getName() << endl;
다음과 같은 오류가 발생합니다.
../main.cpp:35 : 오류 : 'const StudentT'를 'int StudentT :: getId ()'의 'this'인수로 전달하면 한정자가 삭제됩니다.
../main.cpp:35 : 오류 : 'const StudentT'를 'std :: string StudentT :: getName ()'의 'this'인수로 전달하면 한정자가 삭제됩니다.
이 코드에 어떤 문제가 있습니까? 감사합니다!
의 객체 std::set
는로 저장됩니다 const StudentT
. 그래서 당신은 전화를 할 때 getId()
로 const
주로가 아닌 const 멤버 함수는 NO 약속 개체를 수정하지 수 있도록하기 때문에 허용되지 않습니다 const를 객체의 비 const 멤버 함수를 호출하고, 컴파일러가 문제를 감지 개체; 따라서 컴파일러는 객체를 수정하려고 시도 하는 동시에 안전한 것으로 가정 getId()
하지만 동시에 객체가 const임을 알 수 있습니다. 따라서 const 객체를 수정하려고 시도하면 오류가 발생합니다. 따라서 컴파일러는 오류 메시지를 생성합니다.
해결책은 간단합니다. 함수를 다음과 같이 구성하십시오.
int getId() const {
return id;
}
string getName() const {
return name;
}
const 객체를 다음과 같이 호출 getId()
하고 호출 할 수 있기 때문에 필요 getName()
합니다.
void f(const StudentT & s)
{
cout << s.getId(); //now okay, but error with your versions
cout << s.getName(); //now okay, but error with your versions
}
참고로 다음과 같이 구현해야합니다 operator<
.
inline bool operator< (const StudentT & s1, const StudentT & s2)
{
return s1.getId() < s2.getId();
}
참고 매개 변수는 이제 const
참조입니다.
클래스 인스턴스를 수정하지 않는 멤버 함수는 다음과 같이 선언해야합니다 const
.
int getId() const {
return id;
}
string getName() const {
return name;
}
"discards 한정자"가 표시되면 const
또는 에 대해 이야기하는 것 volatile
입니다.
실제로 C ++ 표준 (예 : C ++ 0x draft )은 말합니다 (tnx ~ @Xeo & @Ben Voigt).
23.2.4 연관 컨테이너
5 설정 및 다중 설정의 경우 값 유형은 키 유형과 동일합니다. 맵 및 멀티 맵의 경우 쌍과 같습니다. 연관 컨테이너의 키는 변경할 수 없습니다. 연관 컨테이너의
6 반복자는 양방향 반복기 범주입니다. 값 유형이 키 유형과 동일한 연관 컨테이너의 경우 반복자와 const_iterator는 모두 상수 반복기입니다. iterator와 const_iterator가 동일한 유형인지 여부는 지정되지 않았습니다.
따라서 VC ++ 2008 Dinkumware 구현에 결함이 있습니다.
오래된 답변 :
std lib의 특정 구현 set::iterator
에서와 동일 하기 때문에 오류가 발생 했습니다 set::const_iterator
.
예를 들어 libstdc ++ (g ++로 제공)에는 다음이 있습니다 ( 전체 소스 코드는 여기 참조 ).
typedef typename _Rep_type::const_iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
그리고 SGI의 문서에서 다음과 같이 말합니다.
iterator Container Iterator used to iterate through a set.
const_iterator Container Const iterator used to iterate through a set. (Iterator and const_iterator are the same type.)
반면에 VC ++ 2008 Express는 비 const 메소드를 호출한다고 불평하지 않고 코드를 컴파일합니다 set::iterator
.
좀 더 자세한 예를 들어 보겠습니다. 아래 구조체에 관해서 :
struct Count{
uint32_t c;
Count(uint32_t i=0):c(i){}
uint32_t getCount(){
return c;
}
uint32_t add(const Count& count){
uint32_t total = c + count.getCount();
return total;
}
};
위와 같이 IDE (CLion)에 대한 정보가 Non-const function 'getCount' is called on the const object
있습니다. 메소드 add
count
에서 const 객체로 선언되었지만 메소드 getCount
가 const 메소드가 아니므로 count.getCount()
의 멤버를 변경할 수 있습니다 count
.
아래와 같이 오류를 컴파일하십시오 (컴파일러의 핵심 메시지) :
error: passing 'const xy_stl::Count' as 'this' argument discards qualifiers [-fpermissive]
위의 문제를 해결하려면 다음을 수행하십시오.
- 방법
uint32_t getCount(){...}
을로 변경하십시오uint32_t getCount() const {...}
. 따라서count.getCount()
의 멤버를 변경하지 않습니다count
.
또는
- 로 변경
uint32_t add(const Count& count){...}
하십시오uint32_t add(Count& count){...}
. 따라서count
멤버 변경에 신경 쓰지 마십시오.
당신이 문제에 관해서는, 세트가 StudentT CONST로 저장됩니다 :: 성병에 객체 있지만, 방법을 getId
그리고 getName
당신이 위의 오류를 줄 수 있도록,하지 CONST 있습니다.
또한이 질문을 볼 수 있습니다 클래스의 함수 선언에서 마지막 'const'의 의미? 자세한 내용은.
'Programming' 카테고리의 다른 글
Gson : 주석없이 직렬화에서 특정 필드를 제외하는 방법 (0) | 2020.02.21 |
---|---|
Python 오류“ImportError : No module named” (0) | 2020.02.21 |
EF 마이그레이션 : 마지막으로 적용된 마이그레이션을 롤백 하시겠습니까? (0) | 2020.02.21 |
마크 다운 : 번호 매기기 목록 계속 (0) | 2020.02.21 |
Chrome에서 JavaScript 디버거를 어떻게 시작합니까? (0) | 2020.02.21 |