次のようなコードがあります。
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>* I
I
FloatFooBar
typedef FooBar<float, &MyStruct::s_floatFoo> FloatFooBar;
GCC と VS2005 の両方が満足しています。
どうしたの?これは、VS2005 が GCC とは異なる方法で処理しているある種の微妙なテンプレート置換エラーですか、それともコンパイラのバグですか?
(最も奇妙なことに、今朝早く VS2005 で上記のコードが動作していると思っていました。しかし、それは朝のコーヒーを飲む前のことでした。今では、ある種のカフェイン渇望によって引き起こされたせん妄状態に陥っていなかったという確信はありません.. .)