2016-11-14 43 views
0

我有一个自定义异常类:力调用构造,而不是泛函样式转换

Exception.cc:

#include "Exception.h" 


const char* Exception::getMessage() 
{ 
    return strerror(this -> error_code); 
} 

int Exception::getErrno() 
{ 
    return this -> error_code; 
} 

Exception::Exception(int errno) 
{ 
    this -> error_code = errno; 
} 

Exception.hh

#ifndef __EXECPTION_H__ 
#define __EXECPTION_H__ 

#include <string.h> 

class Exception 
{ 
private: 
    int error_code; 

public: 

    const char* getMessage(); 

    int getErrno(); 

    Exception(int errno); 
}; 

#endif 

而另一家定制类缓冲区它提供了逐字节地反转缓冲区内容的功能:

Buf fer.h:

#ifndef __BUFFER_H__ 
#define __BUFFER_H__ 

#include <stdlib.h> 
#include <cerrno> 

class Buffer 
{ 

private: 
    char * buffer; 
    int size; 


public: 
    Buffer(int size); 
    ~Buffer(); 
    void reverse(); 

    friend class File; 
}; 

#endif 

Buffer.cc:

#include "Buffer.h" 
#include "Exception.h" 


Buffer::Buffer(int size) 
{ 
    this -> size = size; 
    this -> buffer = (char *)malloc(size); 
    if(this -> buffer == NULL) 
    throw Exception(errno); 
} 

Buffer::~Buffer() 
{ 
    if(this -> buffer == NULL) 
    free(this -> buffer); 
} 

void Buffer::reverse() 
{ 
    char tmp; 
    int i; 
    char * tmpb = this -> buffer; 
    for(i = 0; i < this -> size/2; i++) 
    { 
    tmp = (char)tmpb[i]; 
    tmpb[i] = tmpb[size - i - 1]; 
    tmpb[size - i - 1] = tmp; 
    } 
} 

main.cc

#include "Buffer.h" 
#include "Exception.h" 
#include <stdlib.h> 

#include <iostream> 
using namespace std; 

int main (const int argc, const char** argv) 
{ 
    if(argc != 3) 
    exit(-1); 


    return 0; 
} 

编译器给我回的错误:

Buffer.cc:10:11: error: no matching conversion for functional-style cast from 'int' to 'Exception' 
    throw Exception(errno); 
      ^~~~~~~~~~~~~~~ 
./Exception.h:6:7: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const Exception' for 1st 
     argument 
class Exception 
    ^
./Exception.h:17:3: note: candidate constructor not viable: no known conversion from 'int' to 'int (*(*)())' for 1st argument 
    Exception(int errno); 
^
1 error generated. 

它看起来像编译器误解throw Exception(errno);。我在那里调用一个构造函数,它为什么被当作一个类型转换?

+0

我知道这不是你的问题的答案,但你为什么不使用矢量?您可以在两个方向上迭代它,可能不需要反转缓冲区。如果不是,则可以使用STL完成对缓冲区的反转:https://stackoverflow.com/questions/8877448/how-do-i-reverse-a-c-vector – Jens

+0

带有两个下划线'__'的名称由标准保留。 – Jens

+0

@PeterT:Buffer.h包含'cerror'。与errno.h不一样吗? @Jens:我是C++的新手。所以你看我把C和C++混合在一起。 –

回答

6

没有“调用构造函数”这样的事情。 Exception(errno)(Exception)errnostatic_cast<Exception>(errno)在您的代码中都是相同的。

话虽这么说,你的问题的根源是别的东西:你正在使用的保留名称errno,这是一个标准的宏(以实现定义的内容)。宏对C++范围没有考虑,所以你的构造函数声明实际上

Exception(int whatever_errno_actually_expands_to); 

是在我的gcc,这其实是:

Exception(int (*__errno_location())); 

解决办法:不要标识符使用保留名称。

相关问题