为什么我
错误C2597:非法引用非静态成员
'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;
}
答案 0 :(得分:3)
正如Praetorian的评论所提到的,问题在于T()
默认值。根据错误详细信息,using base::T
显然会使编译器混淆搜索T()
作为对base
的非静态成员函数的调用,而不是构造类型{{1的实例}}
这是一个有趣的修复,适用于MSVC 2005 x86(我还没有尝试过任何其他编译器)。请注意,T
会被保留。这要么消除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(){}}; };
,但也是:
错误C2440:'默认参数':无法从''转换为'base :: T' 没有构造函数可以采用源类型,或者构造函数重载解析是不明确的
我不知道编译器在C2597
的含义是什么,但它可能与''
的原始定义有类似的问题。如果我删除base
行,则编译正常。
答案 1 :(得分:0)
为什么使用using base::T
?基类中定义的类型将在派生类中自动可用。
struct base { typedef int T; };
template< class X >
struct derived : base {};
derived<int>::T v = 0; // this is OK in C++
答案 2 :(得分:0)
改为使用它(应该是自我解释):
template<class T>
struct derived : base
{
derived(T = T()) { }
};