这段代码完美编译:
# 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 或 >=