参考模板参数的部分特化无法在VS2005中编译

Bla*_*way 5 c++ templates compiler-errors visual-studio-2005 partial-specialization

我的代码归结为以下内容:

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);
}
Run Code Online (Sandbox Code Playgroud)

这在GCC下成功编译,然而,在VS2005下,我得到:

error C2039: 'func' : is not a member of 'Baz<T>'
        with
        [
            T=FloatFooBar
        ]
error C3861: 'func': identifier not found
Run Code Online (Sandbox Code Playgroud)

但是,如果我const Foo<T>& I改为const Foo<T>* I(通过I指针而不是通过引用),并定义FloatFooBar为:

typedef FooBar<float, &MyStruct::s_floatFoo> FloatFooBar;
Run Code Online (Sandbox Code Playgroud)

GCC和VS2005都很高兴.

这是怎么回事?这是某种微妙的模板替换失败,VS2005处理不同于GCC,还是编译器错误?

(最奇怪的是:我认为今天上午早些时候我已经在VS2005中使用了上述代码.但那是在我早晨喝咖啡之前.我现在还不完全确定我是不是因为某种咖啡因引起的谵妄... .)

abl*_*eul 0

对我来说,VS2005 使用第一个模板规范Baz

template <typename T> struct Baz {};
Run Code Online (Sandbox Code Playgroud)

该结构确实不包含名为 的成员func。看起来 VS2005 没有正确推导模板参数。