2010-12-16 9 views
0

私はMSVC8の簡潔なエラーメッセージ:より明示的になる方法はありますか?

Baz<Foo, Bar> blah_blah(Foo const& f, Bar const& b) 
{ return Baz<Foo, Bar>(f, b); } 

持っていると私はこのエラーを取得:

error C2893: Failed to specialize function template 'Baz<Foo, Bar> blah_blah(Foo, Bar)' 
with the following template arguments: 
'ConcreteFoo' 
'ConcreteBar' 

間違いなく役に立たない、おそらく問題(あるはかなり毛深い関与テンプレートを調査して、私に多くの時間がかかりますし、ConcreteFooConcreteBarはそれ自体が毛状のテンプレートです)。

ConcreteFooConcreteBarのオブジェクト/メンバ関数が存在しないことを知りたいのですが、Bazテンプレートのインスタンス化を妨げています。

Visual C++ 2005からのこの愚かなエラー報告を回避する方法はありますか?

EDIT(関連する):バズ、ConcreteFooとConcreteBarはこのようなものです:

template <typename T, typename U, bool = f(T, U), int = g(T, U), etc> 
struct Baz 
{ ... } 

とかなりの数の部分的な特殊化があります。私はコンパイラのメッセージからどれが取り出されたのか知っています。また、関数fとgは醜いメタプログラミングのものですが、私は自分の問題がそこから来ていると信じています。正しい結果を得られないfまたはgのいずれかがあります。 ConcreteFooまたはConcreteBarのいずれかに型/静的メンバが存在していない必要があります。

また、私はプロジェクトの関連する部分をつかんでテストするためのサイドプロジェクトを書くのは難しいです。もっと「インライン」なものがほしいです。

+0

完全なエラーメッセージをそのまま投稿しないでください。 –

+0

これは確かに私のNDAに違反するだろう。エラーメッセージは、名前が違うにしても、私が投稿したものです。 –

+1

コンパイラが役に立たないとき、私は問題を切り離そうとします。私はしようとします:関数を返すvoidと再コンパイル(実装の機能を空にするように); intなどの他のパラメータ型を試してみてください。 – gnobal

答えて

0

ConcreteFooとConcreteBarはテンプレートですか?それで、それはあなたがしようとしている専門分野か部分専門分野ですか?

完全に失敗した例が表示されない場合は、わかりにくいです。

ところで、コンパイラを責める前に、comeau tryitoutのような別のコンパイラであなたのコードを試してみましたか?

+1

大きなコードベースでは、移植して別のコンパイラでコンパイルするのは容易ではありません。あまりにも多くの依存関係があり、あなたはそれを行う時間を浪費します。彼がNDAと言うとき、彼は彼の職場でのコードについて話していることになるでしょう。フォーラムで作業コードを投稿し始める場合は、刑務所時間を取らなければなりません。 – DumbCoder

+0

それは完全な専門です。 ConcreteBarとConcreteFooは、コンパイラが泣いている時点で完全に専門化されています。実際には、MSVCは2パスルックアップを実装していないため、ConcreteBarとConcreteFooは依存しません。 –

+0

とにかく、質問の編集を参照してください。 –

関連する問題