좀 전에 아래와 같은 코드를 작성하고 있었다.[각주:1]

using ::std::string;
using ::std::deque;

bool Slump::Parse(const string& string, deque< string >& stringsOut)
{
    return true;
}


그런데 컴파일 에러가 발생했다. deque의 _Ty 템플릿 인수가 잘못되었다고 한다. 대체 뭐가 문제인지 1분동안 고민했다. 그리고 알아냈다.

0번 파라미터 이름이 string이라서, 1번 파라미터를 만들 때 deque의 템플릿 파라미터로 넣은 string이 타입이 아니라 변수로 인식된 것으로 보인다. 0번 파라미터 이름을 str 등으로 바꾸거나, 1번 파라미터를 deque<std::string> 으로 변경하자 문제가 사라졌다.

그러니까 0번 파라미터의 변수가 1번 파라미터에서 사용되어버렸다는 소린데... 컴파일러가 무슨 생각으로 이렇게 동작하는지 모르겠다. 파라미터 간 데이터 전달이라도 가능한 문법이라도 있는걸까?

한가지 더 테스트해보았다.

using ::std::string;

void Foo()
{
    string string;
    string stringAnother;
}
여기서도 첫번째 string string은 잘 컴파일되지만, 두번째 string stringAnother는 컴파일 에러가 발생한다.



보통 아직 의미가 확정되지 않은 - 예를 들면 파싱할 때 입력되는 스트링 - 스트링 변수는 그냥 이름을 string으로 짓는데, 저런 경우에 혼란을 발생시킬 문제가 있으니 다른 것으로 바꿔야겠다.

그런데 뭘로 하지... text? str? s?

코드는 최대한 '소리내어 읽을 수 있는' 형태로 작성하고 싶기 때문에 살짝 고민이 된다.

그냥 타입은 std::string으로 써버릴까?
그러자니 가독성이 저해된다. 그냥 text로 쓰는게 그나마 제일 나을 것 같다.

  1. SyntaxHighlighter에서 꺾쇠 기호를 사용하면 태그로 인식되기 때문에 string 좌우로 꺾쇠에 공백을 넣었다. 원래 코드를 작성할 때는 꺾쇠에 공백을 넣지 않는다. [본문으로]
반응형

+ Recent posts