[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
반응형