2014-06-12 32 views
1

因此,我創建了一個名爲Person的結構,其中包含一對getter函數,它返回在getter函數中使用它們之後聲明的變量。當我這樣做在一個單獨的結構沒有錯誤,但是現在有了這個代碼:C++在變量前聲明函數

struct Person 
{ 
    std::string name() const { return name; } 
    std::string address() const { return address; } 

    std::string name; 
    std::string address; 
}; 

我得到這個錯誤:

IntelliSense: no suitable constructor exists to convert from "std::string() const" to "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" 

在另一個結構我有這個...

struct Sales_data 
{ 
    std::string isbn() const { return book_number; } 

    std::string book_number; 
}; 

我沒有得到任何錯誤。我哪裏出了問題,以後如何避免這個問題?

+9

在工作示例中,將'std :: string book_number;'更改爲'std :: string isbn;' - 查看模式?反向應用這些知識來修復非工作代碼。 – user2864740

+0

謝謝你那美妙的OOOOOOOhh ......時刻。解決了這個問題。再次感謝! – Connor

+2

[OT]:您可以通過const引用返回以避免複製(即'const std :: string&isbn()const {return book_number;}') – Jarod42

回答

5

問題是,在第一個例子中,成員方法和成員變量使用了相同的名稱,而第二個例子中使用了不同的名稱。

4

問題在於,在功能name()的範圍內,標識符name引用了函數本身。因此,該函數試圖返回自身,並且無法將返回一個字符串並且不帶參數的const成員函數(即std::string() const)轉換爲std::string

+0

+1來解釋問題的實際原因! – Steger

1

班上有兩個name s。裏面有name這個函數,函數陰影name這個變量。

讓他們不同,一切都會好的。

E.g.將變量更改爲m_name,或將該功能更改爲getName

+2

+1 C++的另一個常見約定是使用'name_'作爲變量。 –

+0

@red_eight。感謝您的支持。是的,使用'name_'作爲成員變量也是一個很好的慣例。 –