gpt4 book ai didi

c++ - 具有依赖类型的简单 CRTP 案例的编译错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:45 24 4
gpt4 key购买 nike

我正在尝试使用一种简单形式的 CRTP(奇怪的重复模板模式),因为我有几个类,每个类都有几个相关的类,我想要一种将它们绑定(bind)在一起的方法(例如,我有类像 Widget、Doobry 和 Whatsit,以及相关类 WidgetHandle、DoobryHandle 和 WhatsitHandle)。

我用来从 Base 继承的每个类都添加了一个 value_type typedef,这样基类就可以将它称为 typename TWrapper::value_type

struct WidgetHandle {};

template <typename TWrapper>
class Base
{
public:
Base(typename TWrapper::value_type value_)
: value(value_) {}

typename TWrapper::value_type value;
};

class Widget : public Base<Widget>
{
public:
typedef WidgetHandle value_type;

Widget(WidgetHandle value_) : Base<Widget>(value_) {}
};

int main(int argc, char* argv[])
{

Widget i(WidgetHandle());
return 0;
}

但是,我遇到了编译错误:

scratch1.cpp(10): error C2039: 'value_type' : is not a member of 'Widget'
scratch1.cpp(16) : see declaration of 'Widget'
scratch1.cpp : see reference to class template instantiation 'Base<TWrapper>' being compiled
1> with
1> [
1> TWrapper=Widget
1> ]
scratch1.cpp(10): error C2039: 'value_type' : is not a member of 'Widget'

这是针对 VS2010 的,尽管我在使用 clang 时遇到了类似的错误。我在这里缺少什么?

最佳答案

修改Base的定义,将句柄类型作为第二个参数,避免循环依赖。

struct WidgetHandle {};

template <typename TWrapper, typename HandleType>
class Base
{
public:
typedef HandleType value_type;

Base(HandleType value_)
: value(value_) {}

HandleType value;
};

class Widget : public Base<Widget, WidgetHandle>
{
public:
Widget(WidgetHandle value_) : Base(value_) {}
};

int main(int argc, char* argv[])
{

Widget i(WidgetHandle());
return 0;
}

您还可以使用特征类来获取 Widget 的 WidgeHandle 类型。

struct WidgetHandle {};
class Widget;

template<class T>
struct Handle
{
};

template<>
struct Handle<Widget>
{
typedef WidgetHandle type;
};

template <typename TWrapper, typename HandleType = Handle<TWrapper>::type>
class Base
{
public:
typedef HandleType value_type;

Base(HandleType value_)
: value(value_) {}

HandleType value;
};

class Widget : public Base<Widget>
{
public:
Widget(WidgetHandle value_) : Base(value_) {}
};

int main(int argc, char* argv[])
{

Widget i(WidgetHandle());
return 0;
}

关于c++ - 具有依赖类型的简单 CRTP 案例的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com