2011-08-05 11 views
3

このプログラムは(gcc-4.5を使用して)コンパイルできません。エラーメッセージは言う:メンバ関数の戻り値の型としてtypedefの型が表示されない

エラー:「myType_tは」今、このコンパイルを行い、クラスabctypedef int myType_t;を宣言する型

1 class abc{ 
    2 //typedef int myType_t; 
    3 
    4 public: 
    5 typedef int myType_t; 
    6 
    7  abc(); 
    8  myType_t fun1(); 
    9 }; 
10 
11 myType_t abc::fun1() 
12 { 
13 return 0; 
14 } 
15 
16 int main() 
17 { 
18 abc abc1; 
19 return 0; 
20 } 

に名前を付けていません。 私の混乱は、クラス内でメンバ関数の戻り値の型がtypedefされた場合の問題です。 myType_t以来

+3

次回にコードを投稿するときは、最初に行番号を削除してください。あなたが持っているコードは適切なテストケースではありません。 –

+0

alrite、問題は行番号もコピーされる 'vi'エディタです。私は次回からこれを世話します。 –

+0

@Aditya:適切なテストケース:コンパイラにコピーして変更なしでコンパイルできるコード。これをコピーするとどうなりますか? http://www.ideone.com/I60DW – Bill

答えて

8

C++標準より:

9.9ネストされた型名[class.nested.type]

タイプ名が他のnames.Inとまったく同じスコープルールに従います特に、クラス定義内で定義された型名は、資格なしでクラス外で使用することはできません。

class X { 
public : 
    typedef int I; 
    class Y {/. . ./}; 
    I a; 
}; 

I b;   // error 
Y c;   // error 
X::Y d;   // OK 
X::I e;   // OK 

だから、としてそれにアクセスする必要があります。これが原因でC++の構文で癖のある

abc::myType_t abc::fun1() 
5
myType_t abc::fun1() 

は、ネストされたタイプですので、あなたはこれを書くためにしました:

abc::myType_t abc::fun1() 
//^^^^^^^^^^^^^note this! 

abc::myType_tがクラスabc内で定義されたコンパイラに指示します。 abc::fun1()と同じ方法で、abc::myType_tと書いてください。しかし、クラス内ではを書く必要はなく、myType_tfun1()も書く必要はありません。

3

メンバー関数のクラスは、関数自体の名前が宣言された瞬間にのみ事前定義されているため、それ以前のものは完全に綴じる必要があります。

ReturnType 
ClassName 
::    // only here do we enter the scope 'ClassName' 
FunctionName 
(
    ArgumentType0, 
    ArgumentType1, 
    ... 
) { 
} 

これは、それがスコープを入力するのに十分な長戻り型の宣言を延期するのでC++ 0xの後半の戻り値の型の構文

auto 
ClassName 
:: 
FunctionName 
(
    ArgumentType0, 
    ArgumentType1, 
    ... 
) 
-> 
ReturnType 
{ 
} 

を使用してovercomedすることができます(それはまた、ベース宣言することができます関数の引数については、たとえばdecltypeを使用します)。

関連する問題