C++:&(std :: cout)作为模板参数

Gae*_*eul 5 c++ templates cout c++11

为什么不能将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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息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.
Run Code Online (Sandbox Code Playgroud)

来自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();
        ^
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

T.C*_*.C. 5

在C++ 17删除此限制之前,限制了指针或引用模板参数的模板参数的语法形式.N4140 [temp.arg.nontype] /1.3表示必须如此

表达(忽略括号)为& id-expression,其中id-expression是对象或函数的名称,但&如果名称引用函数或数组则可省略,如果相应的模板参数为一个参考

(std::cout)不是一个id表达式.这是一个主要表达方式.

核心问题773增加了"(忽略括号)"部分,显然是允许(&i),而不是&(i).


πάν*_*ῥεῖ 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;
}
Run Code Online (Sandbox Code Playgroud)

现场演示


更详细的解释可以在这里找到:

带括号的成员函数地址错误