2014-09-05 125 views
1

,我有以下用C++編寫代碼,涉及模板:模板和映射在C++

#include <assert.h> 
#include <map> 
#include <limits> 

template<class K, class V> class interval_mapping { 
private: 
    std::map<K,V> aMap; 

public: 
    interval_mapping(V const& val) { 
     aMap.insert(
      aMap.begin(), 
      std::make_pair(std::numeric_limits<K>::min(),val) 
     ); 
    } 

    void assign(K const& keyBegin, K const& keyEnd, const V& val) {} 

    V const& operator[](K const& key) const { 
     return (--m_map.upper_bound(key))->second; 
    } 
}; 

int main() 
{ 
    interval_mapping<int, char> myMap; 
} 

我得到的錯誤:

no default constructor exists for class "interval_mapping"

+2

究竟是什麼錯誤說:'interval_mapping myMap;'這一行聲明一個變量'myMap'並調用類的默認構造函數,並且構造函數不存在。 – NetVipeC 2014-09-05 14:55:04

+0

如果你不知道*默認構造函數*是什麼 - 它是一個沒有參數的構造函數。知道這是基礎性的,並且很容易幫助你看到錯誤。所以你可能想咬定子,並在定義你自己的模板類之前檢查一些基礎知識! : - /在任何情況下,歡迎來到StackOverflow ...並注意在問題中放置簽名或說「提前致謝」被認爲[只是佔用空間](http://meta.stackoverflow.com/q/260776/211160);少即是多! – HostileFork 2014-09-05 15:09:24

+0

對所有人:非常感謝你;問題已經解決了。 – 2014-09-05 15:24:00

回答

2

錯誤應該是不言自明的:你正在構造一個interval_mapping對象而不傳遞任何參數,所以這個類需要一個默認的構造函數。如果你自己沒有提供任何其他的構造函數,默認的構造函數只能由編譯器自動生成。

你不需要的默認構造函數做什麼特別的東西,所以你可以添加

interval_mapping() {} 

到類,或

interval_mapping() = default; 

如果你的編譯器支持C++ 11。

如果您真的不希望該類具有默認構造函數,則需要在創建對象的main()行中提供參數。

+1

什麼是downvote?我看不到任何錯誤。 – 2014-09-05 15:00:05

2

正如錯誤說,沒有默認的構造函數,因爲你已經宣佈了你自己的構造函數。

要麼使用該構造

interval_mapping<int, char> myMap(some_char_value); 

或添加一個默認的構造函數;你可能希望它是空的開始:

interval_mapping() {} 
0

您申報interval_mapping一個構造函數一個V const& val。這是爲interval_mapping聲明的唯一構造函數,因爲您已經實現了自己的構造函數,所以不提供默認構造函數。

然後,當您嘗試實例化interval_mapping<int, char>時,您無法提供構造函數所需的V const& val(在這種情況下,它似乎是char)。由於沒有可用的構造函數不接受任何參數,所以您會看到此錯誤。