템플릿 클래스의 변수에서 벡터 반복기를 어떻게 반환합니까?

StackOverflow https://stackoverflow.com/questions/425430

  •  06-07-2019
  •  | 
  •  

문제

나는 템플릿 클래스에서 벡터의 반복기를 반환하려고 노력하고 있습니다 (차이가 있는지 확실하지 않지만 그것을 읽었으므로 언급 할 것이라고 생각했습니다). 문제는 C ++에 대한 오류가 발생한다는 것입니다. 나는 온라인을보고 포럼과 설명에서 볼 수있는 것에서 내가 생각하지 않는다고 생각하지 않는다. 저것 멀리서, 그것은 단지 컴파일하지 않을 것입니다.

template<class T>
class Table
{
public:
  ...

  vector<shared_ptr<vector<T>>>::iterator GetRowIterator();
  //vector<shared_ptr<vector<CellValueType> > >::const_iterator GetRowIterator();

  ...
protected:

  vector<shared_ptr<vector<CellValueType> > > data;  //outside vector is rows, inside vector is columns

  ...
};

vector<shared_ptr<vector<T> > >::const_iterator Table<T>::GetRowIterator()
{
  return data.begin();
}

내가 얻는 오류는 다음과 같습니다.

error C2146: syntax error : missing ';' before identifier 'GetRowIterator'

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   

편집하다:
엔드 각도 브래킷을 변경하여 동일한 오류가 발생하지 않도록했습니다.

이것이 왜 발생하는지에 대한 생각이 있습니까?
언제나 그렇듯이 조언/도움에 미리 감사드립니다!

도움이 되었습니까?

해결책

또한 템플릿 의존적 반환 유형을 선언 할 때 타이프 이름을 사용해야합니다.

typename vector< shared_ptr< vector< T > > >::iterator GetRowIterator();

그리고 메소드 정의

typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
{
  return data.begin();
}

또한 클래스 정의 밖에서 템플릿 클래스 메소드를 정의 할 때는 템플릿 키워드를 사용해야합니다.

template <class T> typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
    {
      return data.begin();
    }

컴파일러가 T가 무엇인지 알 수 있도록.

다른 팁

이 부분은 다음과 같습니다.

vector<shared_ptr<vector<T>>>

C ++ 구문의 문제입니다.

vector<shared_ptr<vector<T> > >

이것은 새로운 표준에 의해 해결되고있는 문제입니다.

Lexer는 컴파일러의 첫 번째 단계이기 때문에 >>>는 이동 좌회전 연산자와 다음을 볼 수 있습니다. 따라서 코드에서 구문 오류가 발생합니다. 이 문제를 억압하려면> 템플릿을 닫을 때의 공백을 추가하면됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top