我正在创建一个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;
答案 0 :(得分:4)
m_equities[symbol]
使用默认构造函数创建元素,如果地图中没有该元素的元素。因此,使用operator[]
需要默认构造函数存在。
您应该使用insert
和std::make_pair
代替。
1:如果密钥不存在,则插入
value_type(key, T())
。 [...]mapped_type
必须符合CopyConstructible
和DefaultConstructible
的要求。如果执行插入,则映射值是值初始化的(默认为类类型构造,否则为零初始化),并返回对它的引用。
和
[...] 返回值:如果没有带键值的元素,则引用新元素的映射值。