【发布时间】:2013-01-14 13:40:08
【问题描述】:
在创建没有附加功能的类型时,我尝试使用using,而不是子类化或使用typedef。
我有一个 CRTP 层次结构,我试图在树上传播具体类型。
GrandKid 似乎编译得很好。有没有办法让GrandKid_2 工作?
错误信息
junk.cpp:18:26: error: ‘GrandKid_2’ was not declared in this scope
代码
template<typename T>
struct Parent
{
};
template<typename T>
struct Child
: public Parent<T>
{
};
struct GrandKid :
public Child<GrandKid>
{
};
// using GrandKid_2 = Child<GrandKid_2>; // doesn't compile
int
main( int argv, char* argc[] )
{
GrandKid gk; // ok
}
【问题讨论】:
-
错误信息是什么意思?
-
@svick 我用错误消息更新了 OP
-
using创建别名,而不是新类型。因此,您不能使用GrandKid_2来定义自己。 -
概念上的问题是,您没有具体类型
GrandKid_2可以传播到Child。您只有Child<...>的别名,但Child<Child<Child<INFINITY>>>显然不起作用。还是您只是想为GrandKid制作 typedef?在这种情况下,一个简单的typedef GrandKid GrandKid_2;就可以了(但我想这不是你的目标)。 -
@kfmfe04 是的,
typedef也会创建别名。
标签: c++ templates c++11 typedef crtp