[英]how can I solve this strange c++ std map problem?
我寫了一些這樣的測試代碼:
#include <iostream>
#include <map>
#include <string>
using namespace std;
using TEST_OBJ = std::map<std::string, std::string>;
class ABB
{
public:
ABB(const TEST_OBJ & src) : m_src(src) {}
public:
void func() { std::cout << "hello"; }
private:
TEST_OBJ m_src;
};
int main()
{
TEST_OBJ o;
ABB a(TEST_OBJ(Afdafdsaa));
return 0;
}
有誰能夠幫助我?
不完全確定你在問什么。 這個問題在使代碼工作的意義上是無法解決的,因為Afdafdsaa
是未定義的。
但是,如果您想獲得更合理的錯誤,那么最佳實踐是使用 C++ 初始化程序語法。 基本問題似乎是a
的聲明被視為函數聲明,而不是對象聲明。 這是因為在這兩種情況下都使用圓括號。
在初始化語法中,大括號用於明確我們正在處理初始化。
因此,將有問題的行更改為:
ABB a{ TEST_OBJ{Afdafdsaa} };
你會得到一個明顯的錯誤。
這個想法是養成始終使用花括號進行初始化的習慣。 如果一切正常,它們就像圓括號一樣工作,但是當出現問題時,這意味着編譯器可以更好地理解您想要做什么。
查看此代碼,它創建了一個新變量:
#include <map>
using std::map;
int main()
{
map<string, string>(adsfafasdf);
map<string, string>::iterator it = adsfafasdf.begin();
return 0;
}
實例化模板/非模板類或類型時會發生同樣的事情
template<class T> class cls
{
public: void v(){cout<< "v"<< endl;}
};
int main()
{
int(i);
i = 123;
cls<string>(bazz);
bazz.v();
return 0;
}
在您的 TEST_OBJ(Afdafdsaa) 的情況下,Afdafdsaa 是在適當位置定義的,但在 () 的范圍之外不可見,並且不會返回到 a 的構造函數。 這就是為什么 a 被視為返回 ABB 的函數聲明,而不是 ABB 類型對象的實例化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.