首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器认为我在传递std::ofstream*&传递std::ofstream*

编译器认为我在传递std::ofstream*&传递std::ofstream*
EN

Stack Overflow用户
提问于 2014-03-21 08:51:42
回答 3查看 112关注 0票数 0

我最近写了一个记录器类。在编译此代码时:

代码语言:javascript
复制
std::ofstream *stream = new std::ofstream;
stream->open( log_file_name.c_str() );

assert( stream->is_open() );

logger( stream, std::string("blurp") );

我知道错误:

代码语言:javascript
复制
no match for call to '(name::space::logger)( std::ofstream*&, std::string )'

关于最后一行代码。

定义记录器的头文件是:

代码语言:javascript
复制
namespace name {
    namespace space {
        class logger {
private:                
            std::ofstream *stream;
            std::string name;
public:                
            void log( std::string, std::string );
            logger( std::ofstream *, std::string );
            logger();
        };
    }
}

我在那里实现了所有原型的函数/构造函数,没有错误。

是什么导致了这一切?谢谢你抽出时间埃克林。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-21 08:53:53

编译器认为您正在对一个名为operator()的对象调用logger。您想要做的似乎是创建一个logger实例:

代码语言:javascript
复制
logger log(stream, std::string("blurp") );

在这里,log是类name::space::logger的一个实例。

票数 1
EN

Stack Overflow用户

发布于 2014-03-21 09:58:13

首先,没有必要为ostream使用指针。因为这不是Java,所以可以在堆栈上创建对象,而无需使用new

然后,您的编译器似乎没有看到logger让构造函数接受流指针和字符串。通过调用,它假定签名必须类似于std::ofstream*&, std::string,但是您提供的构造函数与这个假设完全匹配(请参阅Sebastian的答案以获得详细信息)。

那么,这里有什么问题吗?

  1. 编译器根本看不到标头。那是因为你没有把它包括在内。我认为这不太可能,因为错误消息应该是不同的(还没有定义类logger )。
  2. 编译器会看到另一个版本的标头,它不包含您打算在这里调用的构造函数。这可能是因为您在构造函数中编辑后没有保存标头,或者您可能将其复制到另一个位置,而#include指令找到了一个较旧的版本,而不是您放置构造函数的版本。最好的办法是在头中引入一些明显的错误,然后再编译一次。如果编译器没有抱怨错误,那么它显然不包含正在编辑的标头。
票数 1
EN

Stack Overflow用户

发布于 2014-03-21 10:54:07

GCC用这种奇怪的方式向函数报告论点的类型。

当你这样做时:

代码语言:javascript
复制
logger( stream, std::string("blurp") );

编译器看到对记录器构造函数(name::space::logger)的调用,第一个参数是std::ostream*类型的lvalue (在本例中是一个普通变量),第二个参数是std::string类型的rvalue (临时构造的)。它将此报告为调用签名(name::space::logger)(std::ostream*&, std::string) --此处的& (lvalue引用)仅表示参数为lvalue。这不影响将其与参数类型std::ostream*匹配的能力。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22554089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档