2016-02-21 35 views
2

我正在玩模板。 我有以下模板來總結一個向量的元素:數字類型和字符串的模板函數總和

#include<vector> 
#include <iostream> 
template <class summable> 
summable sum (const std::vector<summable> data, summable initial_value = 0){ 
    std::cout<<"in the function"<<std::endl; 
    for (auto i : data){ 
     initial_value += i; 
    } 
    return initial_value; 
} 

,它是工作完全正常的數字類型。但如果我嘗試傳遞一個字符串矢量,我沒有收到任何編譯錯誤,但函數沒有被調用。 這裏是我的功能main

int main(int argc, char** argv) { 

    vector<string> s {"Hello" , " ", "There" }; 


    cout<<"Before calling the function\n"; 
    cout<<sum(s); 

    return 0; 
} 

我只是得到

調用函數

爲輸出之前。 如果我將函數調用更改爲cout<<sum(s, string(" "));,則該函數按預期工作。我猜它與我定義默認參數的方式有關,因爲0不是字符串的有效值(我認爲)。
我的問題是爲什麼我沒有得到任何錯誤?因爲它能夠編譯它應該運行,不是嗎?

+0

你初始化字符串0 –

+0

@PiotrSkotnicki:是的,但爲什麼沒有編譯器抱怨呢?如果它不正確,該代碼如何編譯? –

+3

您可能需要初始化參數,默認值爲'summable initial_value = summable()' –

回答

5

您正處在正確的軌道上。對於std::string,值0nullptr相同,並匹配採用const char*的構造函數。

但是,將空指針傳遞給該構造函數是未定義的行爲。未定義的行爲意味着任何東西都可能發生。

標準表示:

basic_string(const charT* s, const Allocator& a = Allocator()); 

要求:s點的charT至少traits::length(s) + 1元件的陣列。

效果:構造basic_string類的一個對象,並從 陣列的長度traits::length(s)其第一元件由s指定的charT確定其初始字符串值,如表 指示67.

所以,如果s爲空(或0),則它不指向charT的數組,並且前提條件被違反。


而且,順便說一下,您可以使用summable{}作爲參數的默認值。這適用於任何默認的可構造類型。

+0

AHA! ,這說明了這一點,非常感謝。 –