2009-07-10 3 views
0

일부 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에 전달 선언문을 명확히하기 위해 아무 것도 넣으면 '일시적인 오류'와 관련된 다른 오류가 발생하여 실패합니다.

어떤 의미에서 나는 아직도 완전히 무슨 일이 벌어지고 있는지 이해하지 못한다. 그러나 내 문제를 고치기 위해 진심으로 감사한다. 누군가 나 나 미래의 구글 사람들을 위해 몇 가지 추가적인 설명을 해 주길 원한다면 그것은 좋을 것입니다.

답변

2

이것은 :

Vector<char, sizeof 'a'>& sourceData(); 

인수를 취하지 않고 Vector에 대한 참조를 반환하는 전역 함수를 선언했다. 따라서 sourceData이라는 이름은 기능 유형입니다. 그 멤버에 액세스하려고하면 클래스/구조체/공용체가 아니라고 불평하고, operator->은 단순히 적용 할 수 없습니다. (아무것도없는 경우 생성자에 전달할 인수를 가질 때 만 필요하며, 생략해야 함)

는 괄호를 생략한다, 대신에 객체를 만들려면 :

Vector<char, sizeof 'a'> sourceData; 

그런 당신에게 APPEND 호출 할 수 있습니다 : 객체를 가지고 있기 때문에 사용하기보다는 ->되는 점

sourceData.append('f'); 

참고 아닌 포인터 객체입니다.

sourceDataVector&이 원하는 기능으로 전달하기 위해 특별한 작업을 수행 할 필요는 없습니다. 변수를 전달하면 자동으로 참조로 전달됩니다.

foobar(sourceData, targetData); 
0

C++로 발가락을 감싸는 것은 결코 재미있는 일이 아닙니다. 이 경우 몇 가지 고전적인 실수가 있습니다. 먼저 스택에 Vector의 인스턴스를 만들고 싶습니다. 이 경우 비어있는 ()은 대신에 계측기를 사용하지 않고 Vector에 대한 참조를 반환하는 sourceData라는 함수의 선언으로 해석됩니다. 컴파일러는 결과 함수가 클래스가 아니라는 것에 대해 불평하고 있습니다 (그렇지 않습니다). 대신 Vector의 인스턴스를 만들려면 ()없이 인스턴스를 선언하고 &을 제거하십시오. } 호는 인스턴스 생성자에 인수를 전달하는 경우에만 필요하며 인수가 없으면 생략해야합니다.

당신은

Vector<char, sizeof 'a'> sourceData; 
sourceData.append('f'); 

Vector<char, sizeof 'a'> outData; //if outData is not instantiated already 

foobar(sourceData, outData); 

This 위키 백과 문서는 C++ 참조 괜찮은 소개를 제공합니다.

+0

1) 좋아요,하지만 스택에 벡터를 만들 때 어떻게 참조로 전달할 수 있습니까? 마찬가지로 실제로 어떻게 작동합니까? 저기, 스택에, 어쩌구 저기, 함수 호출, 스택에 새로운 프레임을 밀어, SP를 저장, 우리 locs, 괜찮아, JMP, 새로운 기능을 저장할 수 있습니다 ... 참조 지점을 가리 킵니다. ..어디에? 둘러싸고있는 스택 프레임으로 돌아가는가? C++의 레퍼런스는 고전처럼 보입니다. "더 복잡해지면 더 쉽게 만들 수 있습니다!" 태도. 그리고 다시, 나는 그들이 실제로 무엇인지 모른다. –

+0

참조의 주된 목적 중 하나는 포인터를 사용하지 않고도 참조에 의한 전달을 허용하는 것입니다. 포인터와 달리 참조는 참조 대상의 별칭과 같습니다. 생성시에 할당 할 필요가있어, null는 될 수없고 다른 객체에 대한 참조가되도록 재 할당 할 수 없습니다. 내 답변에 대한 좋은 소개 링크를 추가했습니다. –

+0

참조는 실제로 상위 스택 프레임의 변수 인 원래 객체를 가리 킵니다 (C++의 로컬 변수에 대한 참조를 반환하는 것이 좋은 생각이 아닙니다).이것은 C++에 새로운 것은 아닙니다. C++보다 훨씬 오래 전부터 Algol과 Pascal에 "pass by reference"가 처음 등장한 이래로이 방법을 사용했습니다. –

관련 문제