2012-02-18 5 views
4

私はこの問題にかなり数回遭遇しました。 could not deduce template argument for 'const T *'が、コードが重くテンプレートであることから、それに接続されているゴミのトンがあります(私は言う:私は非ポインタを渡すと、Visual Studioは私にエラーを与えるC++のより良いエラーを報告するためのメソッドのオーバーロード。より良い方法がありますか?

template <typename T> 
bool Foo(T* param) 
{ 
    //... 
} 

:のは、私は方法があるとしましょうそれはエラーに関連していないので、ガベージ...つまり、名前空間とテンプレートの種類など)。はい、私はメッセージを見て間違っていると言うことができますが、それははるかに長くかかるので、人々は長期的にどのように時間を無駄にするかを関連付けることができると思います。

だから、私は、過負荷を提供し、静的アサーションを与えるだろうと思った:

template <typename T> 
bool Foo(T param) 
{ 
    STATIC_ASSERT_FORCE(Function_does_not_take_a_non_pointer_argument); 
} 

これはうまく動作し、私は素敵な、明確なエラーメッセージが表示されます。この関数は、「正しい」関数の定義の直前に置かれ、私(または自分のコードを使用している人)が間違っていたことと、それを修正するために(すなわち、正しいオーバーロードを呼び出すために)

しかし、それは明らかにメソッドリストを汚染します。より良いエラーメッセージを出力する他の方法はありますか?ただparamがポインタであることを前提とし、本体に

template <typename T> 
bool Foo(T param) 
{ 
    //... 
} 

、:代わりに受け入れるだけのポインタの

答えて

1

、あなたはどんなタイプをを受け入れるように機能を変更することができます。そうでなければ、コンパイラはTのためにoperator->またはoperator*が定義されていないと文句を言うでしょう。うまくいけば、Tの具体的な型が何であるかも伝えられます。

これが本当にエラーメッセージの明快さに役立つかどうかはわかりません。しかし、それはボーナスが付属しています:あなたの関数は突然他のポインタのような型にも適用できます!


編集:実際にあなたがしたい事業者がTのために実装されていることを確認し、彼らがいないのであれば明確なエラーを与えるためにいくつかのSFINAE静的アサーションの策略があるかもしれません。たぶん誰かがそれを解決するためにチャイムします。

+0

これは機能を少し明確にしません(特にintellisenseに依存している場合)。だから今ユーザは、関数が非ポインタ型を受け入れて、余分な混乱を招くかもしれないと思うかもしれない?たとえ彼ら(私)が混乱しないとしても、ポインタが受け入れられないように見えるので、非ポインタ型を渡す(または間接参照されたポインタを渡す)のは間違いです。 – Samaursa

+2

テンプレート引数 'TPtr'に名前をつけて、少し明確にすることができます。銀色の弾丸はありません。 – Thomas

+0

ええと、私は実際にその提案が好きです...いくつかの型の操作と組み合わせて、実際に静的なアサーションを関数の先頭に置くことができます...私はそれが好きです(+1)。余分な情報を追加した場合は、これを正しいとマークします。 – Samaursa

関連する問題