구조체 관련 문의드립니다.
글쓴이: zkapdf_1004 / 작성시간: 수, 2022/12/14 - 4:37오후
안녕하세요
구조체 선언 후 그 값을 리턴해주려고하는데 에러가 나네요
왜 구조체를 인식못하는것인지 조언부탁드립니다
header file
class Main{ public: Main() ~Main(); public: struct Test_ST { int count; int index; }; Test_ST GetInfo(); ==> 에러 없음 } cpp file Test_ST* Main::GetInfo() ==> Test_ST가 선언되지않았다고 에러가 발생합니다. { Test_ST *pTest = new Test_ST(); pTest->count = 1; pTest->index = 1; return pTest; }
header file에 구조체를 선언하고 그 구조체를 return 해주려고하는데요...
왜 인식을 못하는건가요?
Forums:
Test_ST *Main::GetInfo()
혹시 Main::Test_ST *Main::GetInfo()
이거일까요? 그리고 *를 추가하셔야죠
*표시 못한건 여기 글쓰면서 실수로 빠트렸네요...
*표시 못한건 여기 글쓰면서 실수로 빠트렸네요... Main::Test_ST*로 하면 정상동작합니다...
왜 Main::Test_ST이렇게 선언을 해야만 가능한건지 궁금해서 글 올린거였어요....
단순하게 생각하시면 되요. 컴파일러가 보는 scope
단순하게 생각하시면 되요. 컴파일러가 보는 scope 안에 Test_ST가 들어오는지..
전역에 선언하면 당연히 아무런 다른 조치를 안해도 컴파일러가 보게 되고요.
지금처럼 클래스 안에 선언하게 되면 컴파일러가 모든 클래스, 다른 헤더를 다 뒤져서 찾을 수도 없죠.
using namespace std; 를 쓰는 것과 마찬가지 입니다.
한번 using namespace Main; 한후 원래대로 해보세요.
별로 권장하지 않는 방법입니다. 굳이 전역적으로 공개하고 싶었으면 전역적으로 선언했으면 되는 거구요. 클래스의 public 내에 둔건 반드시 명시적으로 Main 클래스의 scope에서만 구조체를 사용하기 싶다는 의지를 반영하는 것이라고 봅니다.
...
using namespace Main;
해 봤나요? 그게 되던가요...종종 틀린 소리를 너무 당당하게 해서 되려 헷갈리게 만드는 답변자가 있네요.
저는 이 문제가 단순하다고 생각하지 않습니다.
저는 이 문제가 단순하다고 생각하지 않습니다.
Test_ST
는 명백히Main
의 class scope 안에서 선언되었습니다.따라서 해당 scope 안에서만 unqualified name, 즉
Test_ST
으로 부를 수 있습니다.그런데 멤버 함수
Main::GetInfo
의 정의는 class scope 밖에 있는 것으로 보입니다.이 경우, class scope는 멤버 함수의 정의를 포함하도록 확장됩니다.
그래서 멤버 함수
Main::GetInfo
안에서 지역 변수를Test_ST *pTest
와 같이 선언할 수 있었던 겁니다.그런데 여기에 단서가 하나 더 붙습니다.
class scope에 포함되는 건, 정확히는 멤버 함수의 declarator-id의 뒤부터입니다
반환값 타입은 declarator-id인
Main::GetInfo
의 앞에 있기 때문에 해당 사항이 없죠.따라서
Main::Test_ST
라고 qualified name을 써 주어야 합니다.======
C++11에서 추가된 trailing return type을 쓰면 위와 같은 상황에서 반환값도 unqualified name으로 지정할 수 있게 됩니다.
======
옆에 C++20 표준 문서를 띄워 놓고 보면서 쓰고 있는데도 어렵네요.
제대로 설명하려면 declarative region이나 potential scope 같은 거 다 짚고 넘어가야 하는데 너무 복잡해서 대충 얼버무려서 요약했습니다.
정확하게 알고 싶으면 표준문서 6.4 Scope (basic.scope), 6.5.2 Unqualified name lookup (basic.lookup.unqual) 읽으세요.
감사합니다.
감사합니다.
덕분에 하나 알아갑니다.
'trailing return type'
댓글 달기