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>& Iconst Foo<T>* I(通过I指针而不是通过引用传递),并定义FloatFooBar为:

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 回答