GLorieul GLorieul - 2 months ago 15
C++ Question

C++ : &(std::cout) as template argument

Why isn't it possible to pass

std::cout
's address as template argument?
Or if it is possible then how?

Here is what I tried:

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


And the error message I got from
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.


and from
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();
^


Any ideas?

Answer

This fixes your code, omit the parenthesis:

#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


A more detailed explanation why can be found here:

Error with address of parenthesized member function