为什么当子类是模板时无法识别此 typedef?

时间:2021-06-15 23:24:05

标签: c++ c++11 templates inheritance

这段代码完美编译:

# include <iostream>
# include <typeinfo>

template <typename T>
class HasThisClass
{
    protected:
        typedef T ThisClass;
};

class Foo : private HasThisClass<Foo>
{
    public:
        static void printName()
        { std::cout << typeid(ThisClass).name() << std::endl; }
};

int main()
{
    Foo::printName();
    return 0;
}

此代码无法编译:

# include <iostream>
# include <typeinfo>

template <typename T>
class HasThisClass
{
    protected:
        typedef T ThisClass;
};

template <typename T>
class Bar : private HasThisClass<Bar<T>>
{
    public:
        static void printName()
        { std::cout << typeid(ThisClass).name() << std::endl; } // ERROR here
};

int main()
{
    Bar<double>::printName();
    return 0;
}

出现以下错误:

<块引用>

错误:“ThisClass”未在此范围内声明

我不明白为什么当 Bar 类是模板时它不起作用。我怎样才能获得预期的行为?

注意 1:我不想通过调用 typeid(Bar<double>).name()typeid(typename HasThisClass<Bar<double>>::ThisClass).name() 来解决问题,因为在我的情况下,对 ThisClass 的调用是由宏编写的。< /em>

注意 2:如果您知道在静态函数中操作本地类类型的另一种方法,它可以解决我的问题。

注意 3:我不使用 C++14 或 >=

0 个答案:

没有答案