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

c++ undefined reference to default constructor

我正在创建一个 C++ 11 程序,它可以编译但无法 link。我已将错误(显示在 post 的底部)追踪到一行代码:

            m_equities[symbol] = temp;

其中 m_equities 定义为:

    map<string, EquityInDB> m_equities;

temp 是 EquityInDB 的一个实例。

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

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

g++ -o MetaStockDB main.o date.o tradingday.o equity.o metastockdb.o msfileio.o equityindb.o bytearray.o metastockdb.o: In function 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()'

m_equities[symbol] 使用默认构造函数创建一个元素,如果该键在映射中没有元素。所以使用 operator[] 需要默认构造函数存在。

您应该改用 insertstd::make_pair

std::map operator_at:

1: Inserts value_type(key, T()) if the key does not exist. [...] mapped_type must meet the requirements of CopyConstructible and DefaultConstructible. If an insertion is performed, the mapped value is value-initialized (default-constructed for class types, zero-initialized otherwise) and a reference to it is returned.

[...]Return value: Reference to the mapped value of the new element if no element with key key existed.`