C ++ - 在构造函数中使用引用时出现语法错误

时间:2012-06-23 13:00:56

标签: c++ visual-studio-2008 syntax-error

我正在开发一个包含Win32的mixerXXX API函数的小型OOP / RAII库。

我正在编写一个封装MIXERLINE结构的类,因此我的MixerLine类将其作为标题:

#pragma once
#define UNICODE
#include <stdio.h>
#include <string>
#include <windows.h>
#include "MixerDevice.h"

//////////////////////////////

class MixerLine {

private:
    MIXERLINE _mixerLine;

public:

    MixerLine(MixerDevice& parentMixer, DWORD destinationIndex); 

    ~MixerLine();

};

但是我收到语法错误(在VC9中):

  

错误2错误C2061:语法错误:标识符'MixerDevice'd:\ tfs \ misc \ winwavein \ mixerline.h

为什么信息不是更有用?我不知道它有什么问题。

FWIW,文件MixerDevice.h中根本没有错误。

编辑:以下是原始的整个文件:

MixerLine.h

#pragma once

#define UNICODE
#include <stdio.h>
#include <string>

#include <windows.h>

#include "MixerDevice.h"

//////////////////////////////

class MixerLine {

private:
    MIXERLINE _mixerLine;

public:

    MixerLine(MixerDevice& parentMixer, DWORD destinationIndex); 

    ~MixerLine();

    // Properties

    DWORD getDestinationLineIndex() {
        return _mixerLine.dwDestination;
    }   

    DWORD getSourceIndex() {
        return _mixerLine.dwSource;
    }

    DWORD getLineId() {
        return _mixerLine.dwLineID;
    }

    DWORD getStatus() {
        return _mixerLine.fdwLine;
    }

    std:wstring getStatusString() {

        switch( _mixerLine.fdwLine ) {
            case MIXERLINE_LINEF_ACTIVE:
                return L"MIXERLINE_LINEF_ACTIVE";
            case MIXERLINE_LINEF_DISCONNECTED:
                return L"MIXERLINE_LINEF_DISCONNECTED";
            case MIXERLINE_LINEF_SOURCE:
                return L"MIXERLINE_LINEF_SOURCE";
            default:
                return L"";
        }

    }

    DWORD getUserData() {
        return _mixerLine.dwUser;
    }

    DWORD getComponentType() {
        return _mixerLine.dwComponentType;
    }
};

MixerDevice.h

#pragma once
#define UNICODE

#include <memory>
#include <stdio.h>
#include <iostream>
#include <vector>

#include <windows.h>

////////////////////////

#include "MixerLine.h"

class MixerDevice {

    private:
        DWORD     _deviceId;
        HMIXER    _mixerHandle;
        MIXERCAPS _mixerCaps;

    public:
        MixerDevice(DWORD deviceId);
        ~MixerDevice();

        void enumerateLines();

        // Properties

        DWORD getDeviceId() {
            return _deviceId;
        }

        HMIXEROBJ getHandle() {
            return (HMIXEROBJ)_mixerHandle;
        }

        // Caps

        WORD getManufacturerId() {
            return _mixerCaps.wMid;
        }
        WORD getProductId() {
            return _mixerCaps.wPid;
        }
        MMVERSION getDriverVersion() {
            return _mixerCaps.vDriverVersion;
        }
        WCHAR* getProductName() {
            return _mixerCaps.szPname;
        }
        DWORD getSupportBits() {
            return _mixerCaps.fdwSupport;
        }
        DWORD getDestinationCount() {
            return _mixerCaps.cDestinations;
        }
    };

MixerDevice.cpp(我正在尝试编译的文件):

#include "MixerDevice.h"

using namespace std;

MixerDevice::MixerDevice(DWORD deviceId) {

    _deviceId = deviceId;

    MMRESULT result;

    result = mixerOpen( &_mixerHandle, deviceId, NULL, NULL, MIXER_OBJECTF_MIXER );
    if( result != MMSYSERR_NOERROR ) throw new exception("Call to mixerOpen failed.", result);

    result = mixerGetDevCaps( (UINT)_mixerHandle, &_mixerCaps, sizeof(MIXERCAPS) );
    if( result != MMSYSERR_NOERROR ) throw new exception("Call to mixerGetDevCaps failed.", result);
}

MixerDevice::~MixerDevice() {

    MMRESULT result = mixerClose( _mixerHandle );
    if( result != MMSYSERR_NOERROR ) exit(666);
}

// Methods

void MixerDevice::enumerateLines() {    
}

2 个答案:

答案 0 :(得分:2)

您的代码中包含循环包含,难怪它不起作用。您需要在标题中替换包含前向声明的包含。

MixerLine.h - 用前向声明替换include:

//#include "MixerDevice.h"
class MixerDevice;

并将实现移至实现文件。

答案 1 :(得分:2)

正如Luchian Grigore已经说过的那样,如果前向声明足以包括整个标题(至少在这里和恕我直言),那么它就更好了。

#pragma once对圆形内含物没有帮助,它只能避免无限包含._

但是包含是从MixerDevice.cpp开始的:

MixerDevice.cpp - #include - &gt; MixerDevice.h - #include - &gt; MixerLine.h - #include - &gt; MixerDevice.h

由于#include中的#pragma once,最后MixerDevice.h指令无效。预处理器组装一个看起来像的文档(翻译单元)(使用/P/showIncludes来查看):

  1. 几个StdLib和Windows标题的内容
  2. MixerLine.h的内容
  3. MixerDevice.h的内容
  4. MixerDevice.cpp的内容
  5. 这是编译器有效接收的输入。现在,当编译器到达MixerLine.h

    的内容中的行时
    MixerLine(MixerDevice& parentMixer, DWORD destinationIndex);
    

    名称MixerDevice尚未知晓;该名称在MixerDevice.h内容的文档“下方”中引入。在使用其名称之前,您至少需要声明类MixerDevice。您也可以更改包含顺序,因为MixerDevice目前不依赖MixerLine,但您可能会在此后遇到更多麻烦

    在与Luchian Grigore讨论后,我想指出:

    不要通过反转包含顺序来解决问题,此解决方案仅适用于此特定情况,并且仅在MixerDevice.h中未提及仅在{{1 }}。正如Luchian Grigore所提到的,使用前向声明。