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中使用了上述代码.但那是在我早晨喝咖啡之前.我现在还不完全确定我是不是因为某种咖啡因引起的谵妄... .)
对我来说,VS2005 使用第一个模板规范Baz
template <typename T> struct Baz {};
Run Code Online (Sandbox Code Playgroud)
该结构确实不包含名为 的成员func。看起来 VS2005 没有正确推导模板参数。