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