0

对于我的异常类,我有一个具有多个参数(...)的构造函数,它在 Windows 下工作正常,但是,在 linux 下它编译得很好,但拒绝链接到它。

为什么这在linux下不起作用?

这是一个例子:

class gcException
{
public:
    gcException()
    {
        //code here
    }

    gcException(uint32 errId, const char* format = NULL, ...)
    {
        //code here
    }
}


enum
{
    ERR_BADCURLHANDLE,
};

.

编辑

所以当我这样称呼它时:

if(!m_pCurlHandle)
    throw gcException(ERR_BADCURLHANDLE);

我得到这个编译错误:

error: no matching function for call to ‘gcException::gcException(gcException)’
candidates are: gcException::gcException(const gcException*)
                 gcException::gcException(gcException*)
                 gcException::gcException(gcException&)
4

3 回答 3

6

问题是您的复制构造函数不接受您抛出的临时变量。这是一个临时的,因此是一个右值。对非常量的引用,即gcException&不能绑定到它。在此处阅读详细信息。

正如对该答案的评论所暗示的那样,微软编译器有一个错误,使其绑定指向非常量对象的引用接受右值。您应该将您的复制构造函数更改为:

gcException(gcException const& other) {
    // ...
}

让它发挥作用。它说该错误已在 Visual C++ 2005 中修复。因此,从该版本开始,您会遇到同样的问题。所以最好马上解决这个问题。

于 2009-01-21T05:21:40.297 回答
2

它编译和链接就好了。我将您的测试代码扩展为完整的“程序”:

class gcException {
    public:
        gcException() { }
        gcException(int errId, const char* format, ...) { }
};
int main() { new gcException(1, "foo", "bar", "baz"); }

然后g++ -Wall test.cpp运行没有错误。根据g++ -v,我有 gcc 版本 4.3.2 (Debian 4.3.2-1.1)。我的快速示例是否为您编译?

(您是否可能不小心使用 gcc 而不是 g++ 编译或链接?)

于 2009-01-21T05:20:02.903 回答
0

好吧,刚刚弄清楚了,似乎代码块使用 gcc 而不是 g++ 来编译文件。

于 2009-01-21T05:35:10.080 回答