[effective STL] 항목 06 : C++ 컴파일러의 어이없는 컴파일 조심!
2015. 9. 5. 01:08ㆍ프로그래밍/Effective STL
728x90
728x90
예시
int 데이터가 들어 있는 파일을 가지고 있고, int를 vector에 복사한다고 가정한다.
1 2 3 4 | std::ifstream dataFile("ints.txt"); std::vector<int> data(std::istream_iterator<int>(dataFile), std::istream_iterator<int>()); | cs |
그럼 이런 코드가 생성될 수가 있다.(이렇게 복잡한 코드가...............)
실제로 구현을 해보니
data 자체를 백터로 인식조차 하지 못했다. data라는 이름의 함수로 인식.
이유인 즉슨,
첫 번째 매개 변수는 dataFile이란 이름을 가진다. 타입은 istream_iterator<int>이고
dataFile을 둘러싼 괄호는 컴파일러가 무시한다.
두 번째 매개 변수는 이름을 가지고 있지 않다. 타입은 아무 것도 받아들이지 않고
istream_iterator<int>을 반환하는 함수 포인터이다.
해결(?)
첫 번째 인자에 괄호 한 쌍을 쳐주면 해결된다.
하지만........... 모든 컴파일러가 똑같이 동작하진 않는다.
다시 해결
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <iostream> #include <fstream> #include <vector> #include <iterator> // istream_iterator void main() { std::ifstream dataFile("ints.txt"); /* std::vector<int> data((std::istream_iterator<int>(dataFile)), std::istream_iterator<int>()); */ std::istream_iterator<int> dataBegin(dataFile); std::istream_iterator<int> dataEnd; std::vector<int> data(dataBegin, dataEnd); for (int i : data) { std::cout<<data.at(i); } // 책엔 없지만 닫아주는게 당연하니.. dataFile.close(); } | cs |
15~17라인처럼 하면 된다.
이름이 붙은 반복자 객체를 사용하는 방법은 STL 프로그래밍 스타일에 반하는 것이다.
하지만 컴파일러와 프로그래머 모두에게 혼란을 주는 코드는 사용하면 않는 것이 좋다.
728x90
반응형
'프로그래밍 > Effective STL' 카테고리의 다른 글
[effective STL] 항목 09 : 데이터를 삭제할 때에도 조심스럽게 선택 (0) | 2015.09.07 |
---|---|
[effective STL] 항목 08 : auto_ptr의 컨테이너는 절대 말들지 말기 (0) | 2015.09.06 |
[effective STL] 항목 07 : 포인터를 컨테이너 담을 때 주의 (0) | 2015.09.06 |
맴버 함수는 단일 요소 단위 보단 요소의 범위 단위로 (effective STL 05) (0) | 2015.08.27 |
size() == 0? empty()!! (effective STL 04) (0) | 2015.08.25 |
복사는 컨테이너 안의 객체에 맞게 비용 최소화, 동작은 정확히(effective STL 03) (0) | 2015.08.25 |
컨테이너 독립적인코드라는 환상 조심!(effective STL 02) (0) | 2015.08.25 |