* [link](https://github.com/unknowntpo/bustub/commit/dcbdcdf27d088bbb124e6740d397a6f22d46b44b)
## 問題描述
在我使用
```
um[key] = MapNode(key, value);
```
把新的 `MapNode` 加到 `unordered_map` 時,出現
```
main.cc:17:10: note: candidate constructor not viable: requires 2 arguments, but 0 were provided
```
## 問題分析
第一時間以為 `MapNode` 的 constructor 沒有定義好。
但細看錯誤訊息時發現, compilation error 是在我把新的 `MapNode` 加到 `unordered_map` 時發生。
```
um[key] = MapNode(key, value);
```
以下是完整的 code:
```cpp=
#include "unordered_map"
#include "iostream"
#include "string"
using namespace std;
class MapNode {
private:
string key_;
string value_;
public:
explicit MapNode(string key, string value);
string Show();
};
MapNode::MapNode(string key, string value): key_(key), value_(value){}
string MapNode::Show(){
size_t size = key_.size() + value_.size() + 1;
char buffer[size];
snprintf(buffer,size, "%s%s", key_.c_str(), value_.c_str());
return buffer;
}
int main(int argc, char *argv[]) {
unordered_map<string, MapNode> um;
string key = "hello";
string value = "world";
um[key] = MapNode(key, value);
for (auto &n: um) {
cout << n.second.Show()<< endl;
}
return 0;
}
```
錯誤訊息:
```shell=
$ g++ -std=c++11 -o main main.cc && ./main
In file included from main.cc:1:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/unordered_map:437:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__hash_table:16:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/algorithm:653:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/functional:495:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/bind_front.h:14:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:14:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/tuple:1522:7: error: no matching constructor for initialization of 'MapNode'
second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__utility/pair.h:252:11: note: in instantiation of function template specialization 'std::pair<const s
td::string, MapNode>::pair<const std::string &, 0UL>' requested here
: pair(__pc, __first_args, __second_args,
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/allocator.h:154:28: note: in instantiation of function template specialization 'std::pair<con
st std::string, MapNode>::pair<const std::string &>' requested here
::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/allocator_traits.h:290:13: note: in instantiation of function template specialization 'std::a
llocator<std::__hash_node<std::__hash_value_type<std::string, MapNode>, void *>>::construct<std::pair<const std::string, MapNode>, const std::piecewise_construct_t &, std::t
uple<const std::string &>, std::tuple<>>' requested here
__a.construct(__p, _VSTD::forward<_Args>(__args)...);
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__hash_table:2473:20: note: in instantiation of function template specialization 'std::allocator_trait
s<std::allocator<std::__hash_node<std::__hash_value_type<std::string, MapNode>, void *>>>::construct<std::pair<const std::string, MapNode>, const std::piecewise_construct_t
&, std::tuple<const std::string &>, std::tuple<>, void>' requested here
__node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_),
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__hash_table:2093:29: note: in instantiation of function template specialization 'std::__hash_table<st
d::__hash_value_type<std::string, MapNode>, std::__unordered_map_hasher<std::string, std::__hash_value_type<std::string, MapNode>, std::hash<std::string>, std::equal_to<std:
:string>, true>, std::__unordered_map_equal<std::string, std::__hash_value_type<std::string, MapNode>, std::equal_to<std::string>, std::hash<std::string>, true>, std::alloca
tor<std::__hash_value_type<std::string, MapNode>>>::__construct_node_hash<const std::piecewise_construct_t &, std::tuple<const std::string &>, std::tuple<>>' requested here
__node_holder __h = __construct_node_hash(__hash, _VSTD::forward<_Args>(__args)...);
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/unordered_map:1743:21: note: in instantiation of function template specialization 'std::__hash_table<s
td::__hash_value_type<std::string, MapNode>, std::__unordered_map_hasher<std::string, std::__hash_value_type<std::string, MapNode>, std::hash<std::string>, std::equal_to<std
::string>, true>, std::__unordered_map_equal<std::string, std::__hash_value_type<std::string, MapNode>, std::equal_to<std::string>, std::hash<std::string>, true>, std::alloc
ator<std::__hash_value_type<std::string, MapNode>>>::__emplace_unique_key_args<std::string, const std::piecewise_construct_t &, std::tuple<const std::string &>, std::tuple<>
>' requested here
return __table_.__emplace_unique_key_args(__k,
^
main.cc:30:5: note: in instantiation of member function 'std::unordered_map<std::string, MapNode>::operator[]' requested here
um[key] = MapNode(key, value);
^
main.cc:7:7: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided
class MapNode {
^
main.cc:7:7: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided
main.cc:17:10: note: candidate constructor not viable: requires 2 arguments, but 0 were provided
MapNode::MapNode(string key, string value): key_(key), value_(value){}
^
```
待解問題:
- :question: What is Copy and Move in Cpp ?
- Ref: [一些筆記 — C++: Move Semantics
](https://medium.com/@pumbaawithmask/%E4%B8%80%E4%BA%9B%E7%AD%86%E8%A8%98-c-move-semantics-c1c174357f7d)
- :question: What is piecewise constructor ?
- [What’s up with std::piecewise_construct and std::forward_as_tuple?](https://devblogs.microsoft.com/oldnewthing/20220428-00/?p=106540)