2011-11-21 13 views
-2

この質問は申し訳ありませんが固まっています。私は私からコンパイラを望んでいるん何# include <string> を書くいるC2143エラーC++

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

} 

?!: 私は構文をfolowingています

+0

これは通常、「u」が付いていない「好奇心」の綴りです。 (私はいつも自分自身が間違っている: - /) – 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ファイルでは、 "using namespace std;"を使うことができます。または "std :: string;を使用する" "string"と書いてください。しかし、ヘッダファイルではnamespace-declarationを使用しないでください。

ところで、他の人が文字列を返すと言うと、*は普通ではありません。通常、文字列を返します。

関連する問題