2011-11-21 87 views
-2

对不起这个问题,但我卡住了。 我有如下因素语法:C2143错误C++

class xx 
{ 
..some simple fields like: int t; //))) 
public: class anotherClass; 
xx(); 
MyObj* obj(); 
string* name(); //error C2143: syntax error : missing ';' before '*' 

} 

我已经写# include <string> 是什么编译器我想?

+0

顺便说一句,它通常拼写'好奇'没有'你'。 (我自己总是得到一个错误: - /) – Rup

+1

@Rup:你错了; ** [这不是他所称的,他的名字叫'好奇'](http://www.fredosaurus.com/notes-cpp/arrayptr/60song.html)** – sehe

回答

6

它要你告诉他字符串。你想要的标准之一:

class xx 
{ 
    public: 
    std::string* name(); 
}; 

现在,我不知道你为什么会一个指针重返字符串。如果你问我,那是等待发生的分割错误。似乎合理的,我还有两个可行的选择:

class xx 
{ 
    std::string _name; 
    public: 
    const std::string& name() const 
    { 
     return _name; // WARNING: only valid as long as 
         // this instance of xx is valid 
    } 
}; 

class xx 
{ 
    public: 
    std::string name() const { return "hello world"; } 
}; 
+0

+1,虽然参考确实不是'更安全。 –

+0

@OscarKorz:true。我给出的样例中常见的习惯用法(返回与类实例本身具有相同生命周期的引用)。当然,生命时间很重要,但不必要的复制也是如此。 – sehe

3

您需要可以完全限定字符串或使其当前的命名空间:

std::string* name(); 

using std::string; 

在他一般来说,污染全局命名空间通常被认为是不好的做法,所以首先是首选。

1

编译器不知道什么字符串是因为字符串居住在空间std,而不是在全局命名空间。您需要将字符串更改为std :: string。

在你的CPP文件,您可以使用“使用命名空间std;”或“使用std :: string;”然后只写“字符串”。但是你不应该在头文件中使用using-namespace-声明。

顺便说一句,因为别人都说返回一个字符串*是不同寻常,通常你会返回一个字符串。