我有归结为以下代码:

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 中使用了上面的代码。但那是在我早上喝咖啡之前。我现在不完全确定我没有受到某种咖啡因渴望引起的谵妄.. .)

最佳答案

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

template <typename T> struct Baz {};

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

关于c++ - 带有引用模板参数的部分特化无法在 VS2005 中编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2854156/

10-10 19:33