2012-08-10 6 views
1

일부 코드가 있습니다.운영자 금지 << 전화

#include <iostream> 

template<typename T> 
struct Test 
{ 
    Test(bool v):flg(v) { } 
    void func() { } 
    typedef void (Test::*unspecified)(); 
    operator unspecified() const 
    { 
     return flg ? &Test::func : 0; 
    } 
    bool flg; 
}; 

template<typename T> 
std::ostream& operator << (std::ostream&, typename Test<T>::unspecified); 

int main() 
{ 
    Test<int> t(true); 
    std::cout << t << std::endl; 
} 

출력 그것은 잘 작동

1 

입니다,하지만 난 정의되지 않은 참조를 얻을 싶어요. Testnot template class이면 정의되지 않은 참조가 나타납니다. 그렇다면 컴파일러가 함수 유형으로 operator <<을 사용하지 않고 pointer to class-member에서으로 표준 변환을 수행하는 이유는 무엇입니까? 그것은 ::의 왼쪽에 표시 이후

+0

[템플릿 인수 공제가 여기서 작동하지 않는 이유는 무엇입니까?] (http://stackoverflow.com/questions/1268504/why-is-the-template-argument-deduction-not-working-here?lq=1)를 참조하십시오.) –

+1

템플릿 std :: ostream & operator << (std :: ostream &, const Test &); 템플릿을 사용할 수없는 이유가 있습니까? – juanchopanza

답변

4

typename Test<T>::unspecified에서 T비 추론 될 문맥이다. 따라서 함수 템플릿은 결코 고려되지 않으며 unspecified으로의 변환이 유일하게 실행 가능한 오버로드로 사용됩니다.

간단히 대답하면 간단하게 "템플릿이 그렇게 작동하지 않습니다"입니다. 더 이상 대답을 원하면 알려주세요.

+0

그래, 미안 ... 아니, 난 긴 대답이 필요 없어. – ForEveR

+0

"실제 매개 변수 유형은'::'의 ** 오른쪽 **에 있으며,'::'의 왼쪽에있는 템플릿 인수'T'가 추론했다. " 나는. 장애물은 중첩 된 유형이 인수 공제에 참여하지 않는다는 것입니다. – TemplateRex

관련 문제