我该如何修复以下错误 "no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
How can I fix the following error "no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
给定以下代码:
#include <cstdio>
#include <tr1/memory> // "tr1" is in order to fix it at Eclipse!
using std::tr1::shared_ptr;
class CannotOpenFileException: public std::exception {
};
class FileOutput {
shared_ptr<FILE*> f;
public:
FileOutput(const char* filename) {
FILE* ff = fopen(filename, "w");
if (ff == nullptr) {
throw CannotOpenFileException();
}
f(ff); //****error
}
};
我收到以下错误:
no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'
为什么我会收到此错误,我该如何解决?
注:我想用C语言(at c++)的函数来检查一些东西,所以不用评论了。
你有两个问题:
首先是模板参数是指向的class。所以如果你想要一个指向Foo
的指针,那么模板必须是Foo
。在你的例子中,你说 f
是指向 FILE
的指针。因此,您需要做的第一件事是在定义 f
.
时通过提供类型 FILE
使 f
成为指向 FILE
的指针
第二个问题是变量f
不是一个可以调用的函数,它是一个对象。您需要使用对象 reset
函数:
f.reset(ff);
现在,关于第一个问题,解决它会导致另一个问题。问题的出现是因为 shared_ptr
的默认删除器听起来像这样:它尝试 delete
包含的指针。由于多种原因,这是不可能的(比如 FILE
是 opaque data type,并且指针不是用 new
创建的)。
只需使用 fclose
函数作为删除器即可解决此问题,并将其与 reset
调用一起传递:
f.reset(ff, fclose);
给定以下代码:
#include <cstdio>
#include <tr1/memory> // "tr1" is in order to fix it at Eclipse!
using std::tr1::shared_ptr;
class CannotOpenFileException: public std::exception {
};
class FileOutput {
shared_ptr<FILE*> f;
public:
FileOutput(const char* filename) {
FILE* ff = fopen(filename, "w");
if (ff == nullptr) {
throw CannotOpenFileException();
}
f(ff); //****error
}
};
我收到以下错误:
no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'
为什么我会收到此错误,我该如何解决?
注:我想用C语言(at c++)的函数来检查一些东西,所以不用评论了。
你有两个问题:
首先是模板参数是指向的class。所以如果你想要一个指向Foo
的指针,那么模板必须是Foo
。在你的例子中,你说 f
是指向 FILE
的指针。因此,您需要做的第一件事是在定义 f
.
FILE
使 f
成为指向 FILE
的指针
第二个问题是变量f
不是一个可以调用的函数,它是一个对象。您需要使用对象 reset
函数:
f.reset(ff);
现在,关于第一个问题,解决它会导致另一个问题。问题的出现是因为 shared_ptr
的默认删除器听起来像这样:它尝试 delete
包含的指针。由于多种原因,这是不可能的(比如 FILE
是 opaque data type,并且指针不是用 new
创建的)。
只需使用 fclose
函数作为删除器即可解决此问题,并将其与 reset
调用一起传递:
f.reset(ff, fclose);