Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成器模式、模板和嵌套类 我试图在C++中开发一个嵌套的Builder类,但我一直在得到“不完整类型的无效使用”类NPC::Builder 代码中存在一些语法错误。最重要的是,在这个例子中,第二个模板参数是非类型的,因为它默认为 nulLPTR < /代码>。 // non-type param template<class T, typename std::enable_if<std::is_base_of<Npc, T>::value>::type* = nullptr> class Builder { ... };_C++_Templates_Nested - Fatal编程技术网

生成器模式、模板和嵌套类 我试图在C++中开发一个嵌套的Builder类,但我一直在得到“不完整类型的无效使用”类NPC::Builder 代码中存在一些语法错误。最重要的是,在这个例子中,第二个模板参数是非类型的,因为它默认为 nulLPTR < /代码>。 // non-type param template<class T, typename std::enable_if<std::is_base_of<Npc, T>::value>::type* = nullptr> class Builder { ... };

生成器模式、模板和嵌套类 我试图在C++中开发一个嵌套的Builder类,但我一直在得到“不完整类型的无效使用”类NPC::Builder 代码中存在一些语法错误。最重要的是,在这个例子中,第二个模板参数是非类型的,因为它默认为 nulLPTR < /代码>。 // non-type param template<class T, typename std::enable_if<std::is_base_of<Npc, T>::value>::type* = nullptr> class Builder { ... };,c++,templates,nested,C++,Templates,Nested,下面的代码显示了修复上述所有问题的完整工作示例: #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

下面的代码显示了修复上述所有问题的完整工作示例:

#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;
}
#包括
#包括
类Npc{
公众:
模板
类生成器{
私人:
T*实例;
公众:
Builder*create();//由于模板名称注入,不需要Noc::Builder
生成器*名称(标准::字符串名称);
生成器*charClass(标准::字符串charClass);
建筑商*hp(内部hp);
建造者*法力(智力法力);
生成器*attackPower(int attackPower);
建筑商*magicPower(int magicPower);
建筑商*防御(内部防御);
建筑商*magicDefense(int magicDefense);
T*build();
};
};
结构战士:Npc{};
模板
Npc::建筑商*
Npc::Builder::create(){
返回空ptr;
}
int main()
{
Npc::Builder*Builder=新的Npc::Builder();
删除生成器;
}

我不认为这是真正的问题。确实,必须在标题中实现模板,但这只会导致链接器错误。这里OP有编译时错误,这很可能是由于缺少
typename
。将npc实现移到.h文件中。所有模板化的代码必须可以从使用它的源代码访问。例如,如果你有一个模板类——如果你需要在外部代码中使用它,那么它必须是一个只包含标题的类。当我添加create()方法的定义时,我仍然会遇到错误。就像@lcleite17看到编辑一样,我知道发生了什么。我发布的解决方案应该可以工作,它可以用gcc/clang为我编译。
// 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() {
   ...
}
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;
}