VS2010 IntelliSense说:CComPtr不是模板

Pin*_*ang 1 c++ mfc activex visual-studio-2010

当我尝试将基于directshow的直播播放器编写为ActiveX控件时,我遇到了一个问题.

我首先使用VS2010(在VC++类别下)创建了一个MFC ActiveX控件项目,并在控件上附加了一个对话框,然后使用一个简单的html页面对其进行了测试.

到目前为止它运行良好,但当我尝试使用CComPtr添加一些directshow代码时,编译器显示以下错误(我还附加了行号和文件):

29  IntelliSense: CComPtr is not a template   (CIceBaseLivestreamPlayerCore.h, Line 37)
30  IntelliSense: CComPtr is not a template   (CIceBaseLivestreamPlayerCore.h, Line 38)
31  IntelliSense: CComPtr is not a template   (CIceBaseLivestreamPlayerCore.h, Line 44)
32  IntelliSense: CComPtr is not a template   (CIceBaseLivestreamPlayerCore.h, Line 44)
33  IntelliSense: CComPtr is not a template   (CIceBaseLivestreamPlayerCore.h, Line 47)
34  IntelliSense: CComPtr is not a template   (CIceBaseLivestreamPlayerCore.h, Line 48)
35  IntelliSense: CComPtr is not a template   (CIceBaseLivestreamPlayerCore.h, Line 49)
36  IntelliSense: CComPtr is not a template   (CIcePlayAndSaveAXCore.h, Line 19)
37  IntelliSense: CComPtr is not a template   (CIcePlayAndSaveAXCore.h, Line 20)
38  IntelliSense: CComPtr is not a template   (CIcePlayAndSaveAXCore.h, Line 21)
39  IntelliSense: CComPtr is not a template   (CIcePlayAndSaveAXCore.h, Line 22)
Error   2   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   (CIceBaseLivestreamPlayerCore.h, Line 37)
Error   5   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   (CIceBaseLivestreamPlayerCore.h, Line 38)
Error   14  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   (CIcePlayAndSaveAXCore.h, Line 19)
Error   17  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   (CIcePlayAndSaveAXCore.h, Line 20)
Error   20  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   (CIcePlayAndSaveAXCore.h, Line 21)
Error   23  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   (CIcePlayAndSaveAXCore.h, Line 22)
Error   25  error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_vInfTee' is not a base or member   (CIcePlayAndSaveAXCore.h, Line 9)
Error   27  error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_fileWriter' is not a base or member   (CIcePlayAndSaveAXCore.h, Line 9)
Error   28  error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_AVIMux' is not a base or member   (CIcePlayAndSaveAXCore.h, Line 9)
Error   26  error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_aInfTee' is not a base or member   (CIcePlayAndSaveAXCore.h, Line 9)
Error   12  error C2614: 'CIceBaseLivestreamPlayerCore' : illegal member initialization: 'm_pGraph' is not a base or member   (CIceBaseLivestreamPlayerCore.h, Line 18)
Error   11  error C2614: 'CIceBaseLivestreamPlayerCore' : illegal member initialization: 'm_pControl' is not a base or member   (CIceBaseLivestreamPlayerCore.h, Line 18)
Error   3   error C2238: unexpected token(s) preceding ';'   (CIceBaseLivestreamPlayerCore.h, Line 37)
Error   6   error C2238: unexpected token(s) preceding ';'   (CIceBaseLivestreamPlayerCore.h, Line 38)
Error   15  error C2238: unexpected token(s) preceding ';'   (CIcePlayAndSaveAXCore.h, Line 19)
Error   18  error C2238: unexpected token(s) preceding ';'   (CIcePlayAndSaveAXCore.h, Line 20)
Error   21  error C2238: unexpected token(s) preceding ';'   (CIcePlayAndSaveAXCore.h, Line 21)
Error   24  error C2238: unexpected token(s) preceding ';'   (CIcePlayAndSaveAXCore.h, Line 22)
Error   1   error C2143: syntax error : missing ';' before '<'   (CIceBaseLivestreamPlayerCore.h, Line 37)
Error   4   error C2143: syntax error : missing ';' before '<'   (CIceBaseLivestreamPlayerCore.h, Line 38)
Error   13  error C2143: syntax error : missing ';' before '<'   (CIcePlayAndSaveAXCore.h, Line 19)
Error   16  error C2143: syntax error : missing ';' before '<'   (CIcePlayAndSaveAXCore.h, Line 20)
Error   19  error C2143: syntax error : missing ';' before '<'   (CIcePlayAndSaveAXCore.h, Line 21)
Error   22  error C2143: syntax error : missing ';' before '<'   (CIcePlayAndSaveAXCore.h, Line 22)
Error   7   error C2061: syntax error : identifier 'CComPtr'   (CIceBaseLivestreamPlayerCore.h, Line 44)
Error   8   error C2061: syntax error : identifier 'CComPtr'   (CIceBaseLivestreamPlayerCore.h, Line 47)
Error   9   error C2061: syntax error : identifier 'CComPtr'   (CIceBaseLivestreamPlayerCore.h, Line 48)
Error   10  error C2061: syntax error : identifier 'CComPtr'   (CIceBaseLivestreamPlayerCore.h, Line 49)
Run Code Online (Sandbox Code Playgroud)

所有这些错误似乎都指出CComPtr有些奇怪,但我无法弄清楚出了什么问题.

我在stdafx.h的底部添加了两个头文件,如下所示:

#include <streams.h>
#include <atlbase.h>
Run Code Online (Sandbox Code Playgroud)

我将列出我的CIceBaseLivestreamPlayerCore.h和CIcePlayAndSaveAXCore.h的一部分,如下所示,包含上述错误中涉及的所有行.

CIceBaseLivestreamPlayerCore.h:

#pragma once
#include "stdafx.h"

class CIceBaseLivestreamPlayerCore
{
...
15  CIceBaseLivestreamPlayerCore():
16  ..., m_pGraph(NULL), m_pControl(NULL),
17  ...
18  { ; }
...
37  CComPtr<IGraphBuilder>          m_pGraph;
38  CComPtr<IMediaControl>          m_pControl;
...
44  HRESULT ConnectFilters(CComPtr<IBaseFilter> pIn,  CComPtr<IBaseFilter> pOut, const AM_MEDIA_TYPE& mType);
...
47  HRESULT MatchPin(CComPtr<IPin>, PIN_DIRECTION, BOOL, BOOL*);
48  HRESULT IsPinConnected(CComPtr<IPin>, BOOL*);
49  HRESULT IsPinDirection(CComPtr<IPin>, PIN_DIRECTION, BOOL*);
};
Run Code Online (Sandbox Code Playgroud)

CIcePlayAndSaveAXCore.h:

#pragma once
#include "CIceBaseLivestreamPlayerCore.h"

class CIcePlayAndSaveAXCore : public CIceBaseLivestreamPlayerCore
{
...
7   CIcePlayAndSaveAXCore() :
8   m_AVIMux(NULL), m_fileWriter(NULL), m_aInfTee(NULL), m_vInfTee(NULL)
9   { ; }
...
19  CComPtr<IBaseFilter> m_AVIMux;
20  CComPtr<IBaseFilter> m_fileWriter;
21  CComPtr<IBaseFilter> m_aInfTee;
22  CComPtr<IBaseFilter> m_vInfTee;
};
Run Code Online (Sandbox Code Playgroud)

我项目的其他依赖项是"strmbasd.lib; winmm.lib; uuid.lib;".

这就是全部..希望有人可以给我如何解决它的答案,或者只是给我任何建议或建议作为我应该做的方向.

任何帮助表示赞赏.

这是我第一次发布英语问题(虽然我不是母语人士),所以如果我提出问题,请告诉我是否遗失或做错了什么.

非常感谢.:)

Pin*_*ang 6

经过多次尝试,我终于找到了问题并解决了问题.

我想我应该把结果放在这里,因为可能有人有同样的问题,并且不知道如何像我一样解决它.我不知道回答我自己的问题是否是stackoverflow的礼仪进攻,所以我将不接受这个答案.

正如我所说,我已经#define <atlbase.h>深入到了我的脑海中stdafx.h.但是因为我正在制作一个MFC ActiveX控件项目,所以IDE(VS 2010)自动生成一个#define语句到我的stdafx.h,这是#define _ATL_NO_AUTOMATIC_NAMESPACE.

当我们#include <atlbase.h>平时使用时,编译器将using namespace ATL默认执行,但此#define _ATL_NO_AUTOMATIC_NAMESPACE语句会取消此行为,从而导致我的编译器所说的命名冲突.

因此,在这种情况下,只需使用ATL::CComPtr声明或直接使用using ATL::CComPtrCComPtr出现的语句,这个编译错误将被消除.