2016-03-12 14 views
10

このコードはなぜ機能しますか? f関数の引数については、classというキーワードを先頭に表示していますか?それを追加すれば何が変わるのですか?関数の引数の前にあるclassキーワードは何ですか?

struct A 
{ 
    int i; 
}; 

void f(class A pA) // why 'class' here? 
{ 
    cout << pA.i << endl; 
} 

int main() 
{ 
    A obj{7}; 
    f(obj); 
    return 0; 
} 

答えて

16

関数または変数は、クラスの型の名前と同じ名前の範囲に存在する場合、クラスはelaborated type specifierその結果、曖昧さ回避のための名前の前に付加することができます。

あなたは常に精巧な型指定子を使用することができます。しかし、その主要なユースケースは、同じ名前の関数または変数を持つ場合です。 cppreference.comから

例:

class T { 
public: 
    class U; 
private: 
    int U; 
}; 

int main() 
{ 
    int T; 
    T t; // error: the local variable T is found 
    class T t; // OK: finds ::T, the local variable T is ignored 
    T::U* u; // error: lookup of T::U finds the private data member 
    class T::U* u; // OK: the data member is ignored 
} 
+0

ので、ここで 'class'を' typename'と同じですか? – Narek

+0

@Narek:いいえ。この例(またはあなたのもの)では 'typename'を使ってみてください。失敗すると分かります。 –

+0

この回答は少し間違っています。あなたは精巧な型指定子を使うことは常に許可されています。しかし、主要な*ユースケース*は、同じ名前の関数または変数を持つ場合です。 –

関連する問題