C++ 对非静态成员的非法引用。。。typedef?

C++ 对非静态成员的非法引用。。。typedef?,c++,visual-c++,compiler-errors,non-static,C++,Visual C++,Compiler Errors,Non Static,为什么我会受伤 错误C2597:对非静态成员的非法引用'derived::T' 当我尝试在Visual C++ 2010 X64编译这个代码时?(在x86上似乎不错……哪一个是正确的?) struct base{typedef int T;}; 模板 派生结构:基 { 使用base::T; 派生的(T=T()){} }; int main() { 派生(); 返回0; } 为什么使用base::T使用?在基类中定义的类型将在派生类中自动可用 struct base { typedef int T

为什么我会受伤

错误C2597:对非静态成员的非法引用
'derived::T'

当我尝试在Visual C++ 2010 X64编译这个代码时?(在x86上似乎不错……哪一个是正确的?)

struct base{typedef int T;};
模板
派生结构:基
{
使用base::T;
派生的(T=T()){}
};
int main()
{
派生();
返回0;
}

为什么使用base::T使用
?在基类中定义的类型将在派生类中自动可用

struct base { typedef int T; };
template< class X >
struct derived : base {};
derived<int>::T v = 0;  // this is OK in C++
struct base{typedef int T;};
模板
派生结构:基{};
派生::tV=0;//这在C++中是可以的
改用此选项(应不言自明):

模板
派生结构:基
{
派生的(T=T()){}
};

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

这里有一个在MSVC2005x86中工作的有趣的修复程序(我没有尝试过任何其他编译器)。请注意,
T()
被保留。这要么使用base::T
消除
的歧义,要么只是强制
T
引用继承的类型,而不是使用
类型引用
(对于编译器来说,这显然是不同的)

我得到了原始的
C2597
,但也得到了:

错误C2440:“默认参数”:无法从“”转换为“base::T” 没有构造函数可以采用源类型,或者构造函数重载解析不明确


我不知道编译器所说的
'
是什么意思,但是
base
的原始定义可能存在类似的问题。如果我使用base::T删除
,编译效果会很好行。

我无法重现x64 MSVC 11.0的问题,我在VS2010 x86上也遇到了同样的错误。问题似乎是
T()
默认值。如果将实例化更改为
derived(0)它编译。不知道是什么问题。那不是
template
还是
template
?哇,那是。。。奇怪的。:)+1回答得很好。我使用的是
base::T
,因为原始代码要复杂得多(模板等),编译器抱怨如果我没有使用
提示给它
,它就找不到
T
。所以如果是,你可以
typedef
它,就像STL的所有实现一样。使用
typedef base::T
,它应该适用于所有编译器!!
struct base { typedef int T; };
template< class X >
struct derived : base {};
derived<int>::T v = 0;  // this is OK in C++
template<class T>
struct derived : base
{
    derived(T = T()) { }
};
//...
template<class>
struct derived : base
{
    using base::T;
    derived(T = static_cast<T>( T() )) { } //No error
};
//...
struct base { struct T{T(){}}; };