2012-06-05 9 views
5

精巧な型指定子を使用することを選択する特別な理由はありますか?たとえば、特定の状況では、templateまたはtypenameのキーワードを使用して、依存関係を明確にする必要があります。精巧な型指定子を使用するタイミング

しかし、これは列挙などの場合に発生する例は考えられません。次のコード例を見てみましょう:

enum Foo { A, B }; 

void bar(Foo foo); 
void baz(enum Foo foo); 

なぜ私は構文baz()を使用することを選択するかもしれませんがbar()(またはその逆)上で提供して?あいまいな場合はありますか?

+3

baz構文は、列挙型をtypedefしていない古いCスタイルのキャリーオーバーではないので、明示的に列挙型として参照する必要がありますか?あなたがstruct Foo fを使う方法のように。構造体をtypedefしなかった場合は? C++ではtypedefはenum/struct宣言に暗黙的に記述されているので、型をenum/structと言っている必要はありませんか? – cppguy

+0

類似... http://stackoverflow.com/questions/742699/returning-an-enum-from-a-function-in-c –

答えて

7

名前が別の種類の名前で隠されている場合を除き、そのような指定子を使用する理由はありません。非公式に言えば、オブジェクト名とタイプ名が独立した「名前空間」に住んで、以来、例えば、列挙型の宣言の後Fooという名前の変数を宣言することは完全に合法である(より正式な仕様については3.3/4を参照)

enum Foo { A, B }; 

int Foo; 

int Foo宣言の後、bar宣言は無効になりますが、より綿密なbaz宣言は有効です。

+0

これは意味があります。私はこの事件を考えなかった。確かに、私はそれを行う人を殴るだろうが、私はこれらのコーナーケースについて知りたい。ありがとう! (そして他の人にも。) – Shirik

2

ユーザー定義型の宣言には、詳細な型指定子が必要です。 1つのユースケースは、あなたの型を宣言することです。

enum A { A_START = 0 }; 

void A(enum A a) {} 

int main() { 
    enum A a; 
    A(a); 
} 
0

たときに出てくるかもしれない例です:あなたは、あなたが関数宣言で精巧な型指定を使用する必要があるかもしれスコープで見ていenumと同じ名前の関数を持って万一同じ名前のタイプでも非タイプのエレメントでもあります。 mainfooはないタイプstruct fooに、void foo(struct foo)を指し、精巧な型指定がなければ

struct foo {}; 
void foo(struct foo) {} 
int main() { 
    struct foo f; 
    foo(f); 
} 

:精巧な型指定を使用することにより、明示的にタイプを要求することができます。さて、私はそれが生産コードであることは嫌いですが、あなたは重要な例を求めました。同じ型は、型と関数(または変数)が別の名前空間で定義されていて、型の検索が早い場合に起こります。 structを上記のenumに置き換えることができます。

0

詳細な型指定子を使用するのが良い理由の1つは、ヘッダ内の構造体またはクラスの宣言を転送することです。

void foo(struct foo *) ; 

または、explcitly前方に使用して宣言:タイプ

// a.h 
struct foo {}; 

を定義するヘッダを考えるあなたは

#include "a.h" 
void foo(foo *) ; 

や精巧なタイプを使用して関数のプロトタイプを作成するためにそのヘッダーを含めることができます精巧なタイプ:

struct foo ; 
void foo(foo *) ; 

最後の2つの方法は、ヘッダが完全に接続されたWebに徐々に縮退するのを防ぐのに役立ちます。ここでは、すべての残りの部分に1つのヘッダーが含まれます(私はソフトウェア製品を使用しています。あなたが想像することができる多くの変更が論理的に分離された後)。

C++ 11では、C++ 01コンパイラで現在許可されていないような、このような前方参照が可能です。

関連する問題