我该如何修复以下错误 "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 包含的指针。由于多种原因,这是不可能的(比如 FILEopaque data type,并且指针不是用 new 创建的)。

只需使用 fclose 函数作为删除器即可解决此问题,并将其与 reset 调用一起传递:

f.reset(ff, fclose);