簡體   English   中英

C ++:&(std :: cout)作為模板參數

[英]C++ : &(std::cout) as template argument

為什么不能將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: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

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

有任何想法嗎?

在C ++ 17刪除此限制之前,限制了指針或引用模板參數的模板參數的語法形式。 N4140 [temp.arg.nontype] /1.3表示必須如此

表達(忽略括號內)作為& ID表達 ,其中的ID-expression是對象或函數的名稱,除了&如果名稱是指功能或陣列,並且如果相應的模板-將被省略,可以省略參數是一個參考

(std::cout)不是id-expression 這是一個主要表達方式

核心問題773添加了“(忽略括號)”部分,顯然意味着允許(&i) ,而不是&(i)

這會修復您的代碼,省略括號:

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

現場演示


更詳細的解釋為什么可以在這里找到:

帶括號的成員函數的地址出錯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM