2016-11-16 63 views
14

標準C++ 03語法重載操作如下:理解C++ 03標準語法爲運算符重載

操作員功能-ID
操作者操作者
操作操作 < 模板參數列表?>

第一個是我們通常使用的普通運算符重載語法,例如

Myclass operator + (Myclass s) {...} 

但是第二個選擇是什麼意思?特別是在什麼情況下,我們使用模板參數列表?快速瀏覽C++ 11後,我發現第二種形式已從標準中刪除。它的初衷是什麼?

編輯:用VC++ 2010的測試後,下面是一個使用上述語法的一種方式,儘管它沒有多大意義,對我說:

class K { 
public: 
    int a; 
    template <int B> 
    int operator + (int b) { 
     return a+b+B; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    K k; 
    k.a=1; 
    int s; 
    s=k.operator+<115>(2); 
    printf("%d\n",s); 
    return 0; 

} 

output:118 
+0

什麼是「模板運營商」? – JavaMan

+0

您可以爲班級重載操作員。那些重載可以是模板函數。 – StoryTeller

+0

@StoryTeller但顯式的特化不能在類範圍內。 –

回答

5

的語法規則,它允許運營商功能的專業化模板仍然存在於C++ 11中,它只是在不同的地方。

[temp.names]/1(C++ 03)

甲模板特(14.7)可以通過模板id被稱爲:

模板id:

template-name < template-argument-listopt> 

模板名稱:

identifier 

模板參數列表:

template-argument 
template-argument-list , template-argument 

模板參數:

assignment-expression 
type-id 
id-expression 

[temp.names]/1(C++ 11)

模板專業化(14。

簡單模板id:

template-name < template-argument-listopt> 

模板id:

simple-template-id 
operator-function-id < template-argument-listopt> <- HERE 
literal-operator-id < template-argument-listopt> 

模板名:

identifer 
7)可以通過模板id被稱爲

template-argument-list:

template-argument ...opt 
template-argument-list , template-argument ...opt 

模板參數:

constant-expression 
type-id 
id-expression 

這是有可能這樣做是因爲語法規則操作功能-ID的環境,即當該模板參數列表將沒有任何意義的簡稱,所以他們把統治到更合理的地方< /猜想>。


這裏是行動這一規則的例子:

struct foo{ 
    template <typename T> 
    void operator() (T t) { std::cout << t; } 
}; 

template <> 
void foo::operator()<double> (double) { 
    std::cout << "It's a double!"; 
} 

注專業化爲operator()何時Tdouble。如果你運行這段代碼:

foo f; 
f(0); 
f(0.0); 

然後0將要打印的第一個電話,並It's a double!第二。

Live demo

+0

這比平坦的更有意義刪除它,來想一想:) – StoryTeller

+1

請參閱[核心問題301](http://www.open-std.org/jtc1/sc22/wg21/docs /cwg_defects.html#301)。 –