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;
}