通过引用c ++传递给命名空间中的类

时间:2013-07-24 19:37:24

标签: c++ reference namespaces args

我正在使用g ++ 4.4.1,并且在我的类中在命名空间中通过引用传递问题。我已经创建了下面的测试程序,它能够演示我的问题,并且如果有人知道为什么它不会编译

#include <stdio.h>

namespace clshw
{
    class hwmgr
    {
    private:
        hwmgr() {};

    public:
        ~hwmgr() {};
        static hwmgr* Instance();
        int Read(int crumb, int& state);

    private:
        static hwmgr* instance;
    };
}

namespace clshw
{
    hwmgr* hwmgr::instance = NULL;

    hwmgr* hwmgr::Instance()
    {
        instance = new hwmgr;
        return instance;
    }

    int hwmgr::Read(int crumb, int state)
    {
        state = true;
        return 1;
    }
}

using namespace clshw;

hwmgr *hw = hwmgr::Instance();

int main()
{
    int state;
    int crumb;

    int ret = hw->Read(crumb, state);
}

编译错误是:

test7.cpp:30:错误:'int clshw :: hwmgr :: Read(int,int)'的原型与类'clshw :: hwmgr'中的任何一个都不匹配 test7.cpp:13:错误:候选者是:int clshw :: hwmgr :: Read(int,int&amp;)

TIA, 基思

2 个答案:

答案 0 :(得分:2)

问题在于第13行。

int Read(int crumb, int& state);

您提供了一个函数Read,它接受一个int和一个int的地址。

并在第30行,int hwmgr::Read(int crumb, int state)您定义了一个接受两个int的函数Read。

由于您提供不同类型的参数,因此两种方法都不同。所以编译器会给你错误:'int clshw :: hwmgr :: read(int,int)'的原型与类'clshw :: hwmgr'中的任何一个都不匹配

请修正这样的定义:

在第30行,写下:

int hwmgr::Read(int crumb, int &state)

和tadaaaaa!我们已经成功了。

答案 1 :(得分:2)

您的声明功能Read与您提供的Read定义不同。

宣言:

int Read(int crumb, int& state);

定义:

int hwmgr::Read(int crumb, int state)

您必须决定要使用哪一个(通过引用传递状态),并相应地更改另一个。在这种情况下,似乎引用解决方案是唯一正确的选择,因为您的函数会更改state参数的值。