2011-08-24 9 views
2

다음 코드는 컴파일되지만 decltype을 사용하지 않고이 코드를 작성하는 방법을 모르겠습니다. 나는 실패한 시도를 decltype을 사용하는 줄 아래의 주석 처리 된 줄에 작성했습니다.back_inserter (container) 유형은 무엇입니까

#include <iostream> 
#include <iterator> 
#include <vector> 

using namespace std; 

template<class Out> 
class Fill{ 
public: 
    Fill(){} 
    void fill(Out x){ 
    for(int i = 0; i != 10; i++)*x++ = i; 
    } 
}; 

int main(){ 
    vector<int> v; 

    Fill<decltype(back_inserter(v))> f; //works 

    //does not work 
    //Fill<vector<int>::iterator> g; 

    //does not work 
    //Fill<back_insert_iterator<vector<int>> h; 


    f.fill(back_inserter(v)); 
    copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); 
} 

감사

수레 쉬가

답변

2

유형은 back_insert_iterater<vector<int> > 될 것입니다. 세 번째 예제는 ">>"사이에 공백이 있어야 작동하지 않습니다. http://www.cplusplus.com/reference/std/iterator/back_insert_iterator/을 보면 컨테이너 유형에 대한 포인터를 보유하고 operator =를 container.push_back으로 다시 정의합니다. std 컨테이너가 std 알고리즘으로 작동 할 수 있도록 이것이 존재한다고 생각합니다. 그러나 Fill에 대한 정의를 제어 할 수 있으므로 Fill 클래스가 컨테이너 포인터를 잡고 컨테이너에 대해 push_back을 직접 호출하도록 허용 할 수 있습니다.

+0

당신이 제안한대로 꺾쇠 괄호로 묶어도, 컴파일 오류가 발생합니다 :'error : template argument 1 is invalid'. 나는'-std = C++ 0x' 옵션으로 g ++ 4.4를 사용했다. 그래서 바로 각진 괄호를 유지했습니다. 내 요구 사항은 출력 반복기를 받아들이고 STL'copy' 알고리즘 등에서 볼 수있는 함수를 작성하는 것입니다. 그래서 어디서 잘못 될까요? – suresh

2
vector<int> ints; 
typedef back_insert_iterator<vector<int>> InserterType; // This is what you need. 
Fill<InserterType> f; 
f.fill(back_inserter(ints)); 
copy(ints.begin(), ints.end(), ostream_iterator<int>(std::cout, "\n")); 
+0

내 원래의 게시물에서 하나의 오른쪽 각도 브래킷이 누락되었습니다 따라서 컴파일러는 오류 메시지를 제공했다 .... 바보 같은 실수 .... 수정 된 라인은 아래에 주어진 지금 코드가 올바르게 컴파일! '채우기 >> h;' – suresh

1

당신이 C + +0를 사용하는 경우, 대답은 '자동'D

+0

방금 ​​실제 유형이 무엇인지 알고 싶었습니다. 나는'decltype'을 가지고 관리했지만 정확한 타입을 알고 싶었습니다! – suresh

+1

@fileoffset 시도해 보셨습니까? 나는 생각하지 않는다 Fill f; 컴파일되지 않습니다. – Jagannath

0

내 원래의 게시물에서 실수 내가 브라켓을 각도 3 권리를 놓친 것을 알아 냈어 h의 정의.

Fill<back_insert_iterator<vector<int>>> h; 

코드가 컴파일되어 의도 한대로 작동합니다.

관련 문제