template example c++ templates c++11 cout

example - C++: &(std:: cout) como argumento de plantilla



use templates c++ (2)

Antes de que C ++ 17 eliminara esta restricción, la forma sintáctica de un argumento de plantilla para un puntero o parámetro de plantilla de referencia estaba restringida. N4140 [temp.arg.nontype] /1.3 dice que debe ser

expresado (ignorando paréntesis) como & id-expression , donde id-expression es el nombre de un objeto o función, excepto que & puede omitirse si el nombre se refiere a una función o matriz y debe omitirse si la plantilla correspondiente- parámetro es una referencia

(std::cout) no es una expresión de id . Es una expresión primaria .

La parte "(ignorando paréntesis)" fue agregada por Core issue 773 , y aparentemente está destinada a permitir (&i) , not &(i) .

¿Por qué no es posible pasar la dirección de std::cout como argumento de plantilla? O si es posible, ¿cómo?

Esto es lo que intenté:

#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; }

Y el mensaje de error que recibí de clang++ -std=c++11 :

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.

y de g++ -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(); ^

¿Algunas ideas?


Esto arregla tu código, omite el paréntesis:

#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; }

Demo en vivo

Una explicación más detallada de por qué se puede encontrar aquí:

Error con la dirección de la función miembro entre paréntesis