gpt4 book ai didi

c++ - 具有引用模板参数的部分特化无法在 VS2005 中编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:04 24 4
gpt4 key购买 nike

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

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 中运行了上面的代码。但那是在我早上喝咖啡之前。我现在不完全确定我没有在某些有点像对咖啡因的渴望导致的精神错乱……)

最佳答案

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

template <typename T> struct Baz {};

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com