질문:
다음 코드를 고려하세요.
<code class="cpp">class Bar { public: static const int kConst = 1; void func() { foo(kConst); } }; int main() { Bar b; b.func(); }</code>
이 코드를 컴파일하는 동안 "'Bar::kConst'에 대한 정의되지 않은 참조"라는 오류가 발생합니다. 이 문제가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?
답변:
이 오류는 정적 const int 멤버를 사용하는 경우(함수 또는 캐스트에 전달됨) 때문에 발생합니다. 는 네임스페이스 범위에서 정의되어야 합니다.
C 11 섹션 9.4.2/4에 따르면:
"정적 데이터 멤버가 const 정수 또는 const 열거 유형인 경우 해당 선언은 클래스 정의는 정수 상수 표현식이 되는 상수 초기화 프로그램을 지정할 수 있습니다. 이 경우 멤버는 정수 상수 표현식에 나타날 수 있습니다. 멤버는 프로그램에서 사용되는 경우 계속해서 네임스페이스 범위에 정의됩니다. 🎜>
const 참조로 정적 데이터 멤버를 전달하는 것은 C 11 섹션 3.2/2에 따라 "사용"으로 간주됩니다."...이 sizeof 연산자의 피연산자가 아닌 한 표현식은 잠재적으로 평가됩니다. ... or는 typeid 연산자의 피연산자이고 ...는 다형성 클래스 유형의 lvalue를 지정하지 않습니다. 해당 이름이 잠재적으로 평가되는 표현식에 나타나면 객체 또는 오버로드되지 않은 함수가 사용됩니다."그러나 GCC는 처음에 정적 const 멤버를 네임스페이스 범위에서 정의하지 않고 const 참조로 전달하는 것을 허용했습니다. C 0x 초안에서는 이것이 더 이상 허용되지 않습니다.정적 const 멤버와 같이 존재하지 않는 개체의 주소나 참조를 가져올 때 실질적인 문제가 발생합니다. 여러 번역 단위에서 호출되면 정의되지 않은 동작이 발생할 수 있습니다.이 문제를 해결하려면 다음과 같이 수정하면 됩니다.<code class="cpp">int bar::kConst = 1;</code>
<code class="cpp">foo(static_cast<int>(kConst));</code>
위 내용은 함수에서 정적 const int 멤버를 사용할 때 \"Bar::kConst\'\에 대한 정의되지 않은 참조" 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!