我遇到了一个对我没有什么意义的编译器错误:
#include <memory> using namespace std; auto_ptr<Table> table = db->query("select * from t");
错误:从’Table *’转换为非标量类型’std :: auto_ptr<表>”要求
但是,以下行可以正常工作:
auto_ptr<Table> table(db->query("select * from t"));
这个构造函数的定义是什么,阻止它按照我的期望工作?我以为初始化的声明使用构造函数.
这是我的auto_ptr的构造函数(从SGI STL):
explicit auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
解决方法
这是“显式”关键字.
template <typename T> struct foo { explicit foo(T const *) { } }; template <typename T> struct bar { bar(T const *) { } }; int main(int argc,char **argv) { int a; foo<int> f = &a; // doesn't work bar<int> b = &a; // works }
“显式”关键字可防止构造函数用于隐式类型转换.考虑以下两个函数原型:
void baz(foo<int> const &); void quux(bar<int> const &);
baz(&a); // fails quux(&a); // succeeds
在quux的情况下,您的int指针被隐式转换为一个条.
编辑:要扩展其他人评论的内容,请考虑以下(相当愚蠢)的代码:
void bar(std::auto_ptr<int>); int main(int argc,char **argv) { bar(new int()); // probably what you want. int a; bar(&a); // ouch. auto_ptr would try to delete a at the end of the // parameter's scope int * b = new int(); bar(b); *b = 42; // more subtle version of the above. }