2014-06-12 115 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_'作为成员变量也是一个很好的惯例。 –