[완료] 템플릿 인자추론 실패

netionics의 이미지

#include <iostream>
 
namespace my {
    template <class item>
    class out
    {
    public:
            class in
            {
            };
    };
 
    // 외부 템플릿 클래스 비교
    template <class item>
    bool operator==(out<item>& left, out<item>& right)
    {
        return true;
    }
 
    // 내부 템플릿 클래스 비교
    template <class item>
    bool operator==(typename out<item>::in& left, typename out<item>::in& right)
    {
            return true;
    }
}
 
int main()
{
    my::out<int>::in i1;
    my::out<int>::in i2;
 
    my::out<int> o1;
    my::out<int> o2;
 
    if(o1 == o2)
        std::cout << "out success\n";
    if(i1 == i2)  // 여기서 op==를 찾지 못합니다.
        std::cout << "out::in success\n";
 
    return 0;
}

g++, .net모두 my::out::in에 대한 op==를 찾지 못합니다.
구체적인 에러메세지는 이렇습니다. no match for 'operator==' in i1 == i2

op==를 멤버로 만들면 찾아내긴 합니다.

템플릿이 아닌 일반 클래스일 때도 별다른 문제 없이 op==를 찾아냅니다.

인자 추론이 안되는 이유가 뭘까요?

kewlbear의 이미지

Vandevoorde와 Josuttis의 C++ Templates 170쪽에 보면 template argument deduction에서 제외되는 경우로 아래와 같은 내용이 나옵니다.

However, a few constructs are not deduced contexts:
* Qualified type names. A type name like Q<T>::X will never be used to deduce a template parameter T, for example.
netionics의 이미지

template argument deduction으로 구글링 해보니

그 외에 한 두가지 더 인자추론을 거부하는 경우에 대해서 언급된 부분을 찾을 수 있었습니다.

감사합니다.

:)