ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...41
    일지 2022. 8. 17. 08:32

    템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자

    기본 대응은 없는 것으로 가정하는 것이다

    컴파일러는 템플릿 기본 클래스의 이름은 기본적으로 존재하지 않는 것으로 가정하는데 가령 다음과 같은 코드는 컴파일 에러가 발생하게 된다.


    class LoggingMsgSender : public MsgSender<Company> {

    public:

        void sendClearMsg(const MsgInfo& info)

        {

            ...

            sendClear(info); // 컴파일 에러 발생! sendClear가 존재하는지 확신할 수 없음.

            ...

        }

    };


     

    컴파일러가 기본적으로 기본 클래스의 이름을 없는 것으로 가정하는 이유는 템플릿 기본 클래스는 언제든 특수화되어 특정 이름이 제거될 수 있기 때문이다.

     

    가령 위의 예제는 다음과 같은 특수화가 존재할 수 있을 것이다.


    template<> class MsgSender<CompanyZ> {

    public:

        // sendClear가 존재하지 않는다.

        void sendSecret(const MsgInfo& info) { ... }

    };


     

    ※ 비어있는 template<>는 템플릿 특수화를 나타낼 때 사용된다.

     

    컴파일러에 기본 템플릿 클래스의 이름을 알리는 방법

    세 가지 방법으로 컴파일러에 정보를 전달할 수 있다.

    1. this->를 붙이는 방법 this->sendClear(info);
    2. using 선언을 사용하는 방법 using MsgSender<Company>::sendClaer; // 클래스 내 using 선언
    3. 기본 클래스의 함수라고 명시하는 방법 MsgSender<Company>::sendClear(info); // 이름 사용 시 기본 정보를 표시

     

    이 중 세 번째 방법은 가상 함수 바인딩이 무시되기 때문에 추천되지 않는다.

     

    댓글

Designed by Tistory.