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[]
需要默认构造函数存在。
您应该改用 insert
和 std::make_pair
。
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.`
我正在创建一个 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[]
需要默认构造函数存在。
您应该改用 insert
和 std::make_pair
。
1: Inserts
value_type(key, T())
if the key does not exist. [...]mapped_type
must meet the requirements ofCopyConstructible
andDefaultConstructible
. 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.`