C++ 我可以用成员变量实例化成员类模板吗? class-NDArray{ 私人: 上下文ctx; typeFlag-dtype; std::向量形状; std::共享的ptr数据; 公众: //建造师 NDArray(); NDArray(const NDArray&obj); 显式数组(常量大小);

C++ 我可以用成员变量实例化成员类模板吗? class-NDArray{ 私人: 上下文ctx; typeFlag-dtype; std::向量形状; std::共享的ptr数据; 公众: //建造师 NDArray(); NDArray(const NDArray&obj); 显式数组(常量大小);,c++,templates,C++,Templates,我想在构造函数之后实例化data\uu成员,在这里初始化ctx\u和dtype\u成员 inline-NDArray::NDArray():ctx_u(Context()),shape_{0},dtype_u(typeFlag::kFloat32),{} 内联NDArray::NDArray(const NDArray&obj):ctx_(obj.ctx_)、shape_(obj.shape_)、dtype_(obj.dtype_)、data_(obj.data_){ 然后我得到了错误: ND

我想在构造函数之后实例化
data\uu
成员,在这里初始化
ctx\u
dtype\u
成员

inline-NDArray::NDArray():ctx_u(Context()),shape_{0},dtype_u(typeFlag::kFloat32),{}
内联NDArray::NDArray(const NDArray&obj):ctx_(obj.ctx_)、shape_(obj.shape_)、dtype_(obj.dtype_)、data_(obj.data_){
然后我得到了错误:

NDArray.hpp:18:31: error: invalid use of non-static data member ‘mxnet::NDArray::dtype_’
         std::shared_ptr<TBlob<dtype_, ctx_.dev_type_, ctx_.dev_id_> data_;
                               ^
NDArray.hpp:16:18: note: declared here
         typeFlag dtype_;
NDArray.hpp:18:31:错误:非静态数据成员“mxnet::NDArray::dtype”的使用无效

std::shared_ptr这是我能想到的最接近您想要的东西,但我不知道它是否对您有用。请注意,由于虚拟方法,会有一点开销。我使用了一个更简单的示例,但它应该或多或少是等效的

#包括
#包括
#包括
//模板化类型的基本接口类
类模板接口
{
公众:
//模板化类(纯?)虚拟方法声明
//(参数和返回类型不能依赖于模板值)
虚空打印值()常量=0;
};
//实际模板类型
模板
类temp:公共模板接口
{
公众:
//模板化类实现
虚空打印值()常量
{

std::cout什么是
TBlob
?它似乎需要非类型的
模板
参数。如果是这种情况,则无法向其传递对象的运行时值。这些值必须在编译时已知。唯一可行的方法是,如果您试图传递成员指针。但是,
ctx.dex\u type
ctx\udev_id_
的传递会很复杂。@FrançoisAndrieux谢谢!我添加了
TBlob
的定义,您试图用模板做的事情是不可能的。模板参数必须在编译时知道,但您成员的值不是编译时常量。@FrançoisAndrieux我明白了。谢谢您的帮助,我是我将尝试另一种方法一个选择将是模板化
NDArray
。谢谢你的帮助!我需要一些时间来理解这段代码。它肯定会激励我@欧岳枫 请务必询问您是否有不理解或不清楚的地方。这样做的目的是“隐藏”一个事实,即您的封闭类型是通过父非模板类模板化的,并且因为您已经存储了(smart)指针,您可以使其指向父类型,只要成员函数是虚拟的,实际类的实现就应该可以工作。您好!您的意思是我可以使用多态性来进行数据类型映射吗?由于示例中的值3是编译时已知的常量值,因此我仍然很困惑,如果我编写:
Outer a=Out会怎么样er::make();
其中
int i
仅在运行时已知?而且,为什么
temp::print_value()
仍然是虚拟的?我的问题可能很愚蠢,很抱歉为此麻烦您@欧岳枫 不能将变量用作模板参数(除非它是
constexpr
,在这种情况下,它不是真正的变量)。如果使用模板,则需要在编译时知道所有模板参数。确实如此。我将把实例化放在
Init()中
函数为了避免使用变量作为参数,我使用变量作为条件来选择一个合适的模板类,该类的参数在编译时已知。再次感谢!