일부 Objective C++ (?!) 코드에서 문제를 해결하려고합니다. 나는 그 언어들 중 하나 또는 관련 APIs 나 코드베이스를 모른다. 그래서 나는 좌우로 곤란을 겪고있다. (Obj) C++ : 템플릿에서 클래스를 인스턴스화 (참조)하고 멤버에 액세스합니까?
내가 가진 말 : 그 컴파일 할 때Vector<char, sizeof 'a'>& sourceData();
sourceData->append('f');
, 내가 얻을 :이 경우
error: request for member 'append' in 'WebCore::sourceData', which is of non-class type 'WTF::Vector<char, 1ul >&()();
, 벡터 WTF :: 벡터 (웹킷 또는 KDE 또는 뭔가에서)입니다 STD :: Vector가 아닙니다. append()는 in this documentation처럼 매우 많이이 템플릿에서 생성 된 클래스의 멤버라고 가정합니다. 그것은 벡터입니다. 템플리트가 템플리트되는 유형을 필요로합니다.
이제 Real Man의 프로그래밍 언어로 프로그램을 작성하지 않기 때문에 참고 문헌과 포인터 및 역 참조에 대한 표기법과 우리가 필요로하는 부분에 대해 혼란스러워합니다.
void foobar(const Vector<char>& in, Vector<char>& out)
나는() SIG 내가 무시할 수있는 일이다는 foobar에 const를 추측하고있어, 의미 : 나는 서명과 다른 함수에 전달하려는 때문에
나는 궁극적으로 벡터 참조를 원하는 '걱정하지 마라, 네가 여기에 합격하면 엉망이되지 않을거야.'
나는 포인터가 아닌 것처럼 취급 할 수있는 C++ 참조 사항 중 하나가 아니기 때문에 -> 대신 .append를 사용해 보았습니다. 어느 쪽이든, 그 같은 오류.
오류 메시지를 따라갈 수 없습니다. sourceData와 같은 형식을 취할 수 있습니다. WTF : Vector < char, 1ul> &입니다. 또한 WTF :: Vector 문서를 보면 Vector를 만들 때 .append()를 얻을 수 있습니다. 하지만 나는 템플릿에 익숙하지 않아 정말 그렇게 말할 수는 없습니다.
편집 : (이 파벨 Minaev에 긴 후속이다) WOW 감사의 문제가 해결
!
실제로이 게시물에 대한 편집을 작성하여 웹에서 참조를 통해 첫 번째 요점을 알아 냈습니다. 그 줄은 컴파일러에게 앞으로 params를 사용하지 않는 sourceData()라는 func을 선언합니다. 문자의 Vector를 반환합니다. 이 경우 "비 클래스 유형"은 클래스의 인스턴스이 아닌 유형을 의미합니다. 필자는 그 형식이 'klass'가 아니라는 의미로 해석했습니다. 즉, .addMethod (functionPointer)와 같이 호출 할 수있는 유형입니다.
감사합니다. 네가 제안한 것을하면 나는 생각한다. 어떻게 든, 나는 func sig가 벡터 & 이었기 때문에 나는 &이라고 선언 할 필요가 있었다. 스택 대 힙 전달 문제.
어쨌든, 그건 내 실제 문제였습니다. 당신이 제안한 것을 시도했지만 참조를 초기화하지 않았기 때문입니다. 명시 적으로 생성자를 호출해야하지만, 생성자의 args에 전달 선언문을 명확히하기 위해 아무 것도 넣으면 '일시적인 오류'와 관련된 다른 오류가 발생하여 실패합니다.
어떤 의미에서 나는 아직도 완전히 무슨 일이 벌어지고 있는지 이해하지 못한다. 그러나 내 문제를 고치기 위해 진심으로 감사한다. 누군가 나 나 미래의 구글 사람들을 위해 몇 가지 추가적인 설명을 해 주길 원한다면 그것은 좋을 것입니다.
1) 좋아요,하지만 스택에 벡터를 만들 때 어떻게 참조로 전달할 수 있습니까? 마찬가지로 실제로 어떻게 작동합니까? 저기, 스택에, 어쩌구 저기, 함수 호출, 스택에 새로운 프레임을 밀어, SP를 저장, 우리 locs, 괜찮아, JMP, 새로운 기능을 저장할 수 있습니다 ... 참조 지점을 가리 킵니다. ..어디에? 둘러싸고있는 스택 프레임으로 돌아가는가? C++의 레퍼런스는 고전처럼 보입니다. "더 복잡해지면 더 쉽게 만들 수 있습니다!" 태도. 그리고 다시, 나는 그들이 실제로 무엇인지 모른다. –
참조의 주된 목적 중 하나는 포인터를 사용하지 않고도 참조에 의한 전달을 허용하는 것입니다. 포인터와 달리 참조는 참조 대상의 별칭과 같습니다. 생성시에 할당 할 필요가있어, null는 될 수없고 다른 객체에 대한 참조가되도록 재 할당 할 수 없습니다. 내 답변에 대한 좋은 소개 링크를 추가했습니다. –
참조는 실제로 상위 스택 프레임의 변수 인 원래 객체를 가리 킵니다 (C++의 로컬 변수에 대한 참조를 반환하는 것이 좋은 생각이 아닙니다).이것은 C++에 새로운 것은 아닙니다. C++보다 훨씬 오래 전부터 Algol과 Pascal에 "pass by reference"가 처음 등장한 이래로이 방법을 사용했습니다. –