Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++中的子类模板_C++_Oop_Templates - Fatal编程技术网

C++中的子类模板

C++中的子类模板,c++,oop,templates,C++,Oop,Templates,我知道在java中我们可以做到这一点: class A<T extends B> { ... } 我们可以用C++中的模板做同样的事情吗? 例如,我想要有一个模板类a,其中我们传递的模板T是另一个类B的子类,如上面的java示例。有什么想法吗 编辑: 在其中一个答案中,我被要求显示我的代码,因为我在使用答案时出现了链接错误。 这里是从深层到深层的: //ComponentManager.h ... template <typename T, typename std::en

我知道在java中我们可以做到这一点:

class A<T extends B>
{
...
}
<>我们可以用C++中的模板做同样的事情吗? 例如,我想要有一个模板类a,其中我们传递的模板T是另一个类B的子类,如上面的java示例。有什么想法吗

编辑: 在其中一个答案中,我被要求显示我的代码,因为我在使用答案时出现了链接错误。 这里是从深层到深层的:

//ComponentManager.h
...
template <typename T,  typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
Component* AddComponent(rUUID uuid);
...

//ComponentManager.cpp
...
template <typename T,  typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
Component* ComponentManager::AddComponent(rUUID uuid)
{
...
}

//Engine.h
...
template <typename T,  typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
void AddComponent(rUUID);
...

//Engine.cpp
...
template <typename T,  typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
void Engine::AddComponent(rUUID uuid)
{
...
}
...


//main.cpp
...
e.AddComponent<Position>(a->GetUUID());
...
是的,您可以使用:

是的,您可以使用:


作为SFINAE的替代方案,您可以使用静态断言:


作为SFINAE的替代方案,您可以使用静态断言:



你想传递一个B的泛型子元素?is_base_of::type可能会这样做这只是有点道理,因为如果T满足a的要求,它就会工作,否则它不会编译。@Unit978:是的,我想在类中传递B的模板子类TA@TheArtist:为什么要这样做?排除不是B的子类的模板参数?要传递B的泛型子类?is_base_of::type可能会这样做这只是有点道理,因为如果t满足a的要求,它就可以工作,否则它不会编译。@Unit978:是的,我想在类中传递B的模板子类TA@TheArtist:为什么要这样做,以排除不是B的子类的模板参数?这是我想要的,但我无法使其与成员函数一起工作,我得到链接错误:/。。。有什么想法吗?@艺术家,你能给我看看你正在使用的代码吗?我发现很难理解函数与此有什么关系我编辑了上面的帖子,请检查并告诉我你是否找到了解决方案@您的问题是,模板只能在声明它的翻译单元中定义。否则会出现链接器错误。但是,可以在使用方法的cpp文件中包含方法的显式实例化。例如:模板void引擎::AddComponentrUUID;。另一个选项是简单地将定义与其声明合并。链接错误也是:错误1错误LNK2019:未解析的外部符号public:void\uuu thiscall Engine::AddComponentclass rUUID$AddComponent@VPosition@@$0A@@Engine@@QAEXVrUUID@@@Z在函数\u main中引用这是我想要的,但我无法使其与成员一起工作函数,我得到链接错误:/。。。有什么想法吗?@艺术家,你能给我看看你正在使用的代码吗?我发现很难理解函数与此有什么关系我编辑了上面的帖子,请检查并告诉我你是否找到了解决方案@您的问题是,模板只能在声明它的翻译单元中定义。否则会出现链接器错误。但是,可以在使用方法的cpp文件中包含方法的显式实例化。例如:模板void引擎::AddComponentrUUID;。另一个选项是简单地将定义与其声明合并。链接错误也是:错误1错误LNK2019:未解析的外部符号public:void\uuu thiscall Engine::AddComponentclass rUUID$AddComponent@VPosition@@$0A@@Engine@@QAEXVrUUID@@@Z在函数\u main中引用
#include <type_traits>

template <typename T, typename std::enable_if<std::is_base_of<B, T>::value>::type* = nullptr>
class A
{
    // ...
};
#include <type_traits>
template <typename T>
class A
{
    static_assert(std::is_base_of<BaseClass, T>::value, "error message");
};