gpt4 book ai didi

c++ - 非法引用非静态成员...typedef?

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

为什么会这样

Error C2597: Illegal reference to non-static member 'derived<<unnamed-symbol>>::T'

当我尝试在 Visual C++ 2010 x64 中编译此代码时? (在 x86 上似乎没问题……哪一个是正确的?)

struct base { typedef int T; };

template<class>
struct derived : base
{
using base::T;
derived(T = T()) { }
};

int main()
{
derived<int>();
return 0;
}

最佳答案

正如 Praetorian 的评论所提到的,问题在于 T() 默认值。根据错误详细信息,using base::T 显然会使编译器混淆搜索 T() 作为对 base< 的非静态成员函数的调用 而不是构造 T 类型的实例。

这是一个适用于 MSVC 2005 x86 的有趣修复程序(我没有尝试过任何其他编译器)。请注意,T() 已保留。这要么消除 using base::T 的歧义,要么只是强制 T 引用继承类型而不是 using 类型(这显然不一样编译器的事情)。

//...
template<class>
struct derived : base
{
using base::T;
derived(T = static_cast<T>( T() )) { } //No error
};
//...

编辑:尝试将 base 更改为此并查看您收到的错误消息:

struct base { struct T{T(){}}; };

我得到了原始的 C2597,还有这个:

error C2440: 'default argument' : cannot convert from '' to 'base::T' No constructor could take the source type, or constructor overload resolution was ambiguous

我不知道编译器那里的''是什么意思,但这可能与base的原始定义有类似的问题。如果我删除 using base::T; 行,则编译正常。

关于c++ - 非法引用非静态成员...typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12867698/

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