非法引用非静态成员... typedef?

时间:2012-10-12 22:01:31

标签: c++ visual-c++ compiler-errors non-static

为什么我

  

错误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;
}

3 个答案:

答案 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()) { }
};