Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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++ 不知道类型的模板指针 模板 类容器 { 私人: T数据; 公众: 容器(T newData):数据(newData){} T getData(){return data;} }; int main() { 容器*numContainer=新容器(5); //用numContainer做点什么 删除numContainer; }_C++_Templates_Pointers_Generics - Fatal编程技术网

C++ 不知道类型的模板指针 模板 类容器 { 私人: T数据; 公众: 容器(T newData):数据(newData){} T getData(){return data;} }; int main() { 容器*numContainer=新容器(5); //用numContainer做点什么 删除numContainer; }

C++ 不知道类型的模板指针 模板 类容器 { 私人: T数据; 公众: 容器(T newData):数据(newData){} T getData(){return data;} }; int main() { 容器*numContainer=新容器(5); //用numContainer做点什么 删除numContainer; },c++,templates,pointers,generics,C++,Templates,Pointers,Generics,由于必须指定容器指针的类型,例如int 这可以通过创建一个不是模板的ContainerBase类,并让Container从中派生出来来解决。但是,让指针的类型为ContainerBase将不允许我使用getData()等方法,因为它返回类型T,因此不能在ContainerBase类中声明。 我是否可以有一个指针,它可以指向任何类型的模板类的实例,即使该类包含如上面示例中所示的方法 我是否可以有一个指针,它可以指向任何类型的模板类的实例,即使该类包含如上面示例中所示的方法 不可以,要实例化模板类,

由于必须指定
容器
指针的类型,例如
int

这可以通过创建一个不是模板的
ContainerBase
类,并让
Container
从中派生出来来解决。但是,让指针的类型为
ContainerBase
将不允许我使用
getData()
等方法,因为它返回类型
T
,因此不能在
ContainerBase
类中声明。

我是否可以有一个指针,它可以指向任何类型的模板类的实例,即使该类包含如上面示例中所示的方法

我是否可以有一个指针,它可以指向任何类型的模板类的实例,即使该类包含如上面示例中所示的方法

不可以,要实例化
模板类
,编译器必须知道
t
的类型。将类模板视为类的蓝图,而不是类的具体定义。对于为模板类指定的每种类型(例如,
容器
),编译器都会生成一个单独的定义。编译器在看到模板类的名称时(例如,
容器
)无法凭空推断其类型

IMHO,为了避免每次显式指定模板类型时都使用别名,您可以做的最好的事情如下所示:

template <typename T>
class Container
{
    private:
    T data;
    public:
    Container(T newData) : data(newData) {}
    T getData() {return data;}
};


int main()
{
    Container* numContainer=new Container<int>(5);
    //Do something with numContainer
    delete numContainer;
}
template <typename T>
class Container {
  T data;
public:
  Container(T const &newData) : data(newData) {}
  T getData() const {return data;}
};

using iContainer = Container<int>;

int main() {
    iContainer* numContainer=new iContainer(5);
    //Do something with numContainer
    delete numContainer;
}

必须使用某种类型的类型擦除<代码>容器和
容器
实际上是两个不同的,就编译器而言,不相关的类和它们包含同名成员的事实只是巧合。你打算如何使用
getData
,而不知道类型
T
?取决于你试图实现的是什么,标记的联合可能就是你所需要的。@Yakk说实话,我不知道。这是我不久前遇到的一个问题,但我做了一些不同的事情,不再需要这样的功能。我想你说的是真的,反正我没有真正的方法可以使用那些有问题的方法。你可能已经尝试过了,但无法使用。无论如何如果使用C++ 11,为什么不使用Auto?
class BaseContainer {
public:
    virtual ~BaseContainer() {}
};

template <typename T>
class Container : public BaseContainer {
  T data;
public:
  Container(T const &newData) : data(newData) {}
  T getData() const {return data;}
};

int main() {
  BaseContainer *numContainer = new Container<int>(5);

  Container<int> *ptr = dynamic_cast<Container<int>*>(numContainer);
  if(ptr) std::cout << ptr->getData() << std::endl;;
  delete numContainer;
}