簡體   English   中英

我該如何解決這個奇怪的 c++ std map 問題?

[英]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;
}
  1. 編譯器 g++ 使用未定義的變量“Afdafdsaa”成功編譯了這段代碼
  2. g++ typeid(a).name 告訴我變量“a”是一個函數

有誰能夠幫助我?

不完全確定你在問什么。 這個問題在使代碼工作的意義上是無法解決的,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM