這個腳本
#include <iostream>
#include <unordered_map>
#include <any>
using namespace std;
int main() {
unordered_map<int, any> test;
test[5] = "Hey!";
cout << test[5];
return 0;
}
為什么它不起作用?
candidate function not viable: no known conversion from 'std::__ndk1::unordered_map<int, std::__ndk1::any, std::__ndk1::hash<int>, std::__ndk1::equal_to<int>, std::__ndk1::allocator<std::__ndk1::pair<const int, std::__ndk1::any> > >::mapped_type' (aka 'std::__ndk1::any') to 'const void *' for 1st argument; take the address of the argument with &
basic_ostream& operator<<(const void* __p);
對不起,如果這聽起來有點愚蠢
uj5u.com熱心網友回復:
這是因為沒有<<為 astd::ostream和的運算子定義多載std::any。
<<是為字串文字、std::strings、數字和一些其他特定物件定義的。std::any這些都不是。
僅僅因為它碰巧實際上包含一個字串并不會使它成為 astd::string或其他任何東西。僅僅因為你打開你的車門,進去坐下,或者把你的狗放進車里,或者一堆雜貨,并不能把你的車變成一個人,或者狗,或者一堆蔬菜。它仍然是一輛車,只是里面有東西。
所以沒有<<為此定義運算子。這就是您的 C 編譯器告訴您的內容:它需要為and<<定義的運算子,但沒有。std::ostreamstd::any
uj5u.com熱心網友回復:
只需添加一個any_cast到test[5]. 這種強制轉換的主要原因是告訴編譯器<<要呼叫哪個多載函式test[5],<<沒有為 定義任何函式std::any。因此,我們告訴編譯器呼叫const char *或std::string多載<<.
始終,確保sizeof分配的test[n]必須匹配sizeof型別轉換。例如:
sizeof(std::string) = 32 bytes
sizeof(const char *) = 8 bytes
這就是為什么我們首先需要分配test[5]using std::string("Hey!");,而不是 just "Hey!"。
但是,sizeof(int *)等于sizeof(char *),如果你這樣做,可能會導致 3 個問題:
- 段錯誤
- 未定義的行為
- 例外:
std::bad_any_cast
使固定
std::cout << std::any_cast<const char *>(test[5]);
或者std::string
test[5] = std::string("Hey!");
std::cout << std::any_cast<std::string>(test[5]);
uj5u.com熱心網友回復:
要解決錯誤,您可以使用std::any_cast它提供對包含物件的型別安全訪問,如下所示:
std::cout << std::any_cast<const char*>(test[5]);
或者
test[5] = std::string("Hey!");
std::cout << std::any_cast<std::string>(test[5]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/472982.html
上一篇:有問題理解fork()層次樹
下一篇:CGAL:填孔.exe檔案卡住
