c ++未定义的默认构造函数引用

时间:2017-09-05 04:13:56

标签: c++ linker-errors default-constructor

我正在创建一个C ++ 11程序,它编译但无法链接。我已经将错误(在这篇文章的底部显示)跟踪到一行代码:

            m_equities[symbol] = temp;

其中m_equities定义为:

    map<string, EquityInDB> m_equities;

和temp是EquityInDB的一个实例。

有人可以解释为什么这一行代码导致下面的链接器错误?看起来有一行试图使用默认构造函数创建我的EquityInDB类的实例(没有)。我的EquityInDB类需要构造函数中的参数。

(注意:注释掉上面的一个赋值行可以编译所有内容)

  

g ++ -o MetaStockDB main.o date.o tradingday.o equity.o metastockdb.o   msfileio.o equityindb.o bytearray.o metastockdb.o:在函数中   std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, EquityInDB>::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, 0ul>(std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>&, std::tuple<>&, std::_Index_tuple<0ul>, std::_Index_tuple<>)': Makefile:254: recipe for target 'MetaStockDB' failed /usr/include/c++/6.3.1/tuple:1586: undefined reference to EquityInDB :: EquityInDB()&#39;

1 个答案:

答案 0 :(得分:4)

m_equities[symbol]使用默认构造函数创建元素,如果地图中没有该元素的元素。因此,使用operator[]需要默认构造函数存在。

您应该使用insertstd::make_pair代替。

std::map operator_at

  

1:如果密钥不存在,则插入value_type(key, T())。 [...] mapped_type必须符合CopyConstructibleDefaultConstructible的要求。如果执行插入,则映射值是值初始化的(默认为类类型构造,否则为零初始化),并返回对它的引用。

  

[...] 返回值:如果没有带键值的元素,则引用新元素的映射值。

相关问题