2016-09-29 3 views
5

std::cout의 주소를 템플릿 인수로 전달할 수없는 이유는 무엇입니까? 아니면 가능하면 어떻게 될까요?C++ : 템플릿 인수로 & (std :: cout)

#include <iostream> 

template<std::ostream* stream> 
class MyClass 
{ 
public: 
    void disp(void) 
     { (*stream) << "hello"; } 
}; 

int main(void) 
{ 
    MyClass<&(std::cout)> MyObj; 
    MyObj.disp(); 

    return 0; 
} 

그리고 오류 메시지가 나는 clang++ -std=c++11에서 가져온 : 여기

내가 뭘하려

main.cpp: In function ‘int main()’: 
main.cpp:15:22: error: template argument 1 is invalid 
    MyClass<&(std::cout)> MyObj; 
        ^
main.cpp:15:29: error: invalid type in declaration before ‘;’ token 
    MyClass<&(std::cout)> MyObj; 
          ^
main.cpp:16:8: error: request for member ‘disp’ in ‘MyObj’, which is of  non-class type ‘int’ 
    MyObj.disp(); 
     ^

어떤 아이디어 :

main.cpp:15:11: error: non-type template argument does not refer to any declaration 
     MyClass<&(std::cout)> MyObj; 
       ^~~~~~~~~~~ 
main.cpp:6:24: note: template parameter is declared here 
template<std::ostream* stream> 
        ^
1 error generated. 

g++ -std=c++11에서

?

+4

왜 괄호 안에 넣었습니까? 또한 액세스 수준을 수정하십시오. – LogicStuff

+1

괄호없이 시험해보기 :'MyClass <&std::cout> MyObj; – aschepler

+1

어떻게 구문 분석되는지에 대한 설명을보고 싶습니다. – LogicStuff

답변

2

이 코드를 수정은 괄호를 생략 :

#include <iostream> 

template<std::ostream* stream> 
class MyClass 
{ 
public: 
    void disp(void) { 
     (*stream) << "hello"; 
    } 
}; 

int main(void) 
{ 
    MyClass<&std::cout> MyObj; 
    MyObj.disp(); 

    return 0; 
} 

Live Demo


여기에서 찾을 수 있습니다 이유에 대한 자세한 설명 :

Error with address of parenthesized member function

+0

링크를 제공해 주셔서 감사합니다! ;) –

+0

@GLorieul'& std :: cout'은 함수 포인터가 아니라 전역 인스턴스의 주소입니다. –

+1

"설명"은 위조입니다. 우리는 여기에 회원에 대한 포인터를 형성하지 않습니다. –

5

C +를하기 전에 +17은이 제한을 제거했다. 포인터 또는 참조 템플릿 매개 변수에 대한 템플릿 인수가 제한되었습니다. N4140은 [temp.arg.nontype] /1.3는

ID 표현 객체 또는 함수의 이름 &ID 표현로 (무시 괄호) 표현되어야 말한다 이름은 함수 또는 배열 생략한다을 참조하는 경우 해당 템플릿 파라미터가 참조

경우 해당 & 제외하고 생략 될 수있다은 id- 표현이 아닙니다. 기본 표현식입니다.

"(ignoring 괄호)"부분에 Core issue 773이 추가되었으며 (&i)이 아닌 &(i)이 허용됩니다.

+0

이것은 나에게 너무 기술적입니다 ... "통합 양식"이란 무엇입니까? –

관련 문제