我的代码归结为以下内容:
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 中运行了上面的代码。但那是在我早上喝咖啡之前。我现在不完全确定我没有处于某种咖啡因渴望引起的谵妄中。 .)