构建器模式、模板和嵌套类
Builder pattern, templates and nested class
我试图在c++中开发一个嵌套的构建器类,但我一直得到这个"无效使用不完整类型'类Npc::Builder<'T>"错误。我搜索了很多,但我找不到答案。有人能帮帮我吗?
下面是我的代码:
Npc.h
class Npc{
...
template<class T, class enable_if<is_base_of<Npc, T>::value>::type* = nullptr>
class Builder{
private:
T* instance;
public:
Npc::Builder<T>* create();
Npc::Builder<T>* name(string name);
Npc::Builder<T>* charClass(string charClass);
Npc::Builder<T>* hp(int hp);
Npc::Builder<T>* mana(int mana);
Npc::Builder<T>* attackPower(int attackPower);
Npc::Builder<T>* magicPower(int magicPower);
Npc::Builder<T>* defense(int defense);
Npc::Builder<T>* magicDefense(int magicDefense);
T* build();
};
};
Npc.cpp
...
template<class T, class enable_if<is_base_of<Npc, T>::value>::type* = nullptr>
Npc::Builder<T>* Npc::Builder<T>::create() {
...
}
main.cpp
...
Npc::Builder<Warrior>* builder = new Npc::Builder<Warrior>();
...
谢谢!
您的代码中有一些语法错误。最重要的是,您缺少一个typename
(因为您有一个依赖类型),而且在这种情况下,第二个模板参数也是一个非类型,因为您将其默认为nullptr
。使用
// non-type param
template<class T, typename std::enable_if<std::is_base_of<Npc, T>::value>::type* = nullptr>
class Builder { ... };
或者使其成为类型
// type param
template<class T, class = typename std::enable_if<std::is_base_of<Npc, T>::value>::type>
class Builder { ... };
下一行
template<class T, enable_if<is_base_of<Npc, T>::value>::type* = nullptr>
Npc::Builder<T>* Npc::Builder<T>::create() {
...
}
错误:缺少typename
,不能有默认参数。在定义中,编译器也认为您部分专门化了模板成员函数,这是不允许的。您需要的是如下内容:
template<class T, typename std::enable_if<std::is_base_of<Npc, T>::value>::type* U>
Npc::Builder<T, U>*
Npc::Builder<T, U>::create() {
return nullptr;
}
下面的代码显示了一个完整的工作示例,修复了上面提到的所有问题:
#include <iostream>
#include <type_traits>
class Npc {
public:
template<class T,
typename std::enable_if<std::is_base_of<Npc, T>::value>::type* U = nullptr>
class Builder {
private:
T* instance;
public:
Builder* create(); // no need for Noc::Builder<T>, due to template name injection
Builder* name(std::string name);
Builder* charClass(std::string charClass);
Builder* hp(int hp);
Builder* mana(int mana);
Builder* attackPower(int attackPower);
Builder* magicPower(int magicPower);
Builder* defense(int defense);
Builder* magicDefense(int magicDefense);
T* build();
};
};
struct Warrior: Npc{};
template<class T, typename std::enable_if<std::is_base_of<Npc, T>::value>::type* U>
Npc::Builder<T, U>*
Npc::Builder<T, U>::create() {
return nullptr;
}
int main()
{
Npc::Builder<Warrior>* builder = new Npc::Builder<Warrior>();
delete builder;
}
Live on Coliru
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 嵌套的匿名命名空间
- 了解嵌套循环打印星号图案
- C++中具有嵌套条件的 X 模式
- 何时在C 中使用嵌套类上的PIMPL模式,反之亦然
- C++ 是否可以使用对变量的引用来简化这种嵌套循环模式?
- 我似乎无法弄清楚这种嵌套循环模式C++
- 使用嵌套 while 循环创建模式
- 嵌套循环:数字模式
- 是否有任何设计模式可以避免嵌套开关外壳
- 如何在不使其过度嵌套的情况下使此模式根据需要重复多次
- 构建器模式、模板和嵌套类