C++中的模板和映射

Template and map in C++

本文关键字:映射 C++      更新时间:2023-10-16

我在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;
}

我得到错误:

类"interval_mapping"不存在默认构造函数

这个错误应该是不言自明的:您在构建interval_mapping对象时没有传递任何参数,所以该类需要一个默认的构造函数。默认构造函数只有在您自己不提供任何其他构造函数的情况下才由编译器自动生成。

你不需要默认的构造函数来做任何特殊的事情,所以你可以添加

interval_mapping() {}

到类,或

interval_mapping() = default;

如果您的编译器支持C++11。

如果您确实不希望类具有默认构造函数,则需要在main()中创建对象的行中提供一个参数。

正如错误所说,没有默认的构造函数,因为您已经声明了自己的构造函数。

要么使用该构造函数

interval_mapping<int, char> myMap(some_char_value);

或者添加默认构造函数;你可能希望它一开始是空的:

interval_mapping() {}

您为接受V const& valinterval_mapping声明一个构造函数。这是为interval_mapping声明的唯一构造函数,并且没有提供默认构造函数,因为您已经实现了自己的构造函数。

然后,当您尝试实例化interval_mapping<int, char>时,您无法提供构造函数所需的V const& val(在这种情况下,似乎是char)。由于没有可用的构造函数不接受任何参数,所以您会看到这个错误。