Re: [問題] class當函式用

看板C_and_CPP作者 (AzureBlaze)時間13年前 (2013/02/20 01:01), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
第一個()確實是operator overloading 第二個()是這個operator的參數 例如 class MyClass{ int operator()(int x,int y){return x+y;} }; 如果你產生一個物件 MyClass foo; 然後對這個物件使用()時就會呼叫這個operator foo(1 ,2); // 1+2 = 3 連續兩組()只是單純因為這個函數不接受任何參數而已 也就是說你應該把他看成一個名為"operator()"的函數,他的參數是() 所以說你前面的理解是正確的 問題在於後面generate()這邊 generate第三個參數的需求是一個物件 而這個物件必須有定義operator()() 可以參考看看generate的實做: template <class ForwardIterator, class Generator> void generate ( ForwardIterator first, ForwardIterator last, Generator gen ) { while (first != last) { *first = gen(); ^^^^^ ++first; } } 也就是說你塞進去的gen必須可以被用()呼叫 因此generate(....., calc_square()); 這邊的()並不是operator(),而是呼叫calc_square的constructor產生一個新物件 這個物件進入generate之後他的operator()才會被呼叫 所以當你把他改成generate(....., calc_square[])時 變成先呼叫operator[],產生一個int給generate用 int並沒有operator()可以給generate用,自然complier就不給你過了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.122.58

02/20 01:20, , 1F
感謝,我想我懂了
02/20 01:20, 1F
文章代碼(AID): #1H8w_E_b (C_and_CPP)
文章代碼(AID): #1H8w_E_b (C_and_CPP)