用shared_ptrs实现函数模板的C++实例化
C++ instantiation of function template with shared_ptrs
可能重复:
C++将派生类shared_ptr传递给模板化函数
当我们使用指针时,编译器在实例化方面没有问题。
template <typename T> struct Base{
virtual ~Base() {}
};
template <typename T> struct Der: public Base<T> {
};
template <class T>
void f(Base<T>* b) {}
int main() {
Der<int> x;
f(&x);
}
但是,如果我将f更改为使用shared_ptrs,编译器将找不到匹配项。
template <class T>
void f(shared_ptr<Base<T> >b) {}
int main() {
shared_ptr<Der<int> > x(new Der<int>);
f(x);
}
Z.cc: In function ‘int main()’:
Z.cc:45: error: no matching function for call to ‘f(std::tr1::shared_ptr<Der<int> >&)’
将x更改为
shared_ptr<Base<int> > x(new Der<int>);
也会起作用。为什么行为上会有这种差异?
shared_ptr<Der<int>>
不可隐式转换为shared_ptr<Base<int>>
,而Der<int>*
可隐式转化为Base<int>*
。C++不会因为模板参数类型恰好是可转换的,就自动使从模板实例化的类型可转换,因为这不一定有意义,而且可能很危险。
http://www2.research.att.com/~bs/bs_faq2.html#转换
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- [temp.variadic]中关于包扩展实例化的措辞