テンプレートを頻繁に使用するコードがあります。それはGCC上ではうまくコンパイルされますが、構文解析中に失敗するVS(2003年 - 2010年のベータ1でテスト済み)ではコンパイルされません。残念ながら、問題を減らして数行で再現できるコード構造は十分にわかりませんので、私は原因を推測することしかできません。私はここの誰かが正しい方向に私を向けることを望んでいます。私たちは、VS、(多くの中で)最初のエラーメッセージでコンパイルするとテンプレートのメンバtypedefが、VSでは宣言されていない識別子で、GCCでは宣言されていません。
template< class UInt, typename IntT,
bool is_signed = std::numeric_limits<IntT>::is_signed >
struct uii_ops_impl;
// ....
template<class UInt>
struct uii_ops_impl< UInt,
typename make_signed<typename UInt::digit_type>::type, true >
{
typedef UInt unbounded_int_type;
typedef typename make_signed< typename unbounded_int_type::digit_type >::type
integral_type;
// ...
static void add(unbounded_int_type& lhs, integral_type rhs);
// ...
};
template<class UInt>
void uii_ops_impl<
UInt, typename make_signed<typename UInt::digit_type>::type,
true >::add(unbounded_int_type& lhs, integral_type rhs)
{
// ....
}
それは返してい
は
です:エラーC2065: '
unbounded_int_type
':宣言されていない識別子
私は、typedefでポイントを指しています huh? :-S
EDIT:
テンプレートパラメータとして使用されて
typename make_signed<typename UInt::digit_type>::type
に何かがあると思われます。残りのコードでは、メンバ関数のパラメータで使用される同様のtypedefがうまくコンパイルされます。これまでのところ私が見ることのできる唯一の違いは、他のケースのどれもテンプレートパラメータとして上記の行がないことです。 make_signed
はBoost.TypeTraitsのものです。
EDIT:まったく同じことが、それは罰金コンパイル、別のファイルで行われているため
さて、多分それは、それではないです。うーん...
バウンティEDIT:
さて、私はそれは、コンパイラが文句を言っている場合、問題は実際にはない、この時点では明らかだと思います。特定のポイントでの2つのメンバ関数定義のみが失敗します。明示的にパラメータを修飾すると、はまだにコンパイルされません。唯一の直接の解決策は、関数をインラインで定義することです。これは構文解析に合格します。ただし、std::allocator<void>
にsize_type
のメンバーがないため、テンプレートをインストールしようとするとVSが失敗します。 VSは、size_type
を宣言していないT = voidの特殊化をstd::allocator<T>
にしています。私はsize_type
がすべてのアロケータの必須メンバーだと思いましたか?
ここで問題になるのは、構文解析時にVSを非常に悪くして、完全に無関係な非問題をエラーとして訴え、そのようなコードをどのようにデバッグしますか?
p.s.余分な時間がある人のために、私がVSで仕事をしようとしているコードは、Kevin Soppのmp_mathがBoostのサンドボックスにあります。これはlibtommathに基づいています。
これは最初のエラーですか?そうでない場合は、以前のエラーがコンパイラを混乱させる可能性が非常に高いです。 – sbi
*「最初のエラーメッセージ(多くのうち)...」というメッセージにポイントする*: – KTC
Visual C++で使用したテストケースコードを入れてもらえますか?多分元のコードとのいくつかの違いを理解することができます。 –