5

次のようなコードがあります。

template <typename T> struct Foo {};
template <typename T, const Foo<T>& I> struct FooBar {};

////////

template <typename T> struct Baz {};

template <typename T, const Foo<T>& I>
struct Baz< FooBar<T,I> >
{
 static void func(FooBar<T,I>& value);
};

////////

struct MyStruct
{
 static const Foo<float> s_floatFoo;
};

// Elsewhere: const Foo<float> MyStruct::s_floatFoo;

void callBaz()
{
 typedef FooBar<float, MyStruct::s_floatFoo> FloatFooBar;
 FloatFooBar myFloatFooBar;
 Baz<FloatFooBar>::func(myFloatFooBar);
}

これは GCC では正常にコンパイルされますが、VS2005 では次のようになります。

error C2039: 'func' : is not a member of 'Baz<T>'
        with
        [
            T=FloatFooBar
        ]
error C3861: 'func': identifier not found

ただし、 (参照ではなくポインターで渡す) に変更const Foo<T>& Iし、次のように定義すると:const Foo<T>* IIFloatFooBar

typedef FooBar<float, &MyStruct::s_floatFoo> FloatFooBar;

GCC と VS2005 の両方が満足しています。

どうしたの?これは、VS2005 が GCC とは異なる方法で処理しているある種の微妙なテンプレート置換エラーですか、それともコンパイラのバグですか?

(最も奇妙なことに、今朝早く VS2005 で上記のコードが動作していると思っていました。しかし、それは朝のコーヒーを飲む前のことでした。今では、ある種のカフェイン渇望によって引き起こされたせん妄状態に陥っていなかったという確信はありません.. .)

4

1 に答える 1

0

私にとって、VS2005は最初のテンプレート仕様を使用しているようですBaz

template <typename T> struct Baz {};

この構造体には、実際には という名前のメンバーが含まれていませんfunc。VS2005 がテンプレート パラメータを正しく推測していないようです。

于 2010-05-18T18:52:42.963 に答える