Ping Fang Chiang
Ping Fang Chiang

Reputation: 123

VS2010 IntelliSense says: CComPtr is not a template

I have encountered a problem when I was trying to write a directshow-based livestream player as an ActiveX control.

I first created a MFC ActiveX control project with VS2010 (under VC++ category), and attached a dialog on the control, then tested it with a simple html page.

So far it works well, but when I tried to add some directshow codes with CComPtr, the compiler shows the following errors (I've also attached the line numbers and files):

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)

And all these errors seem to specify that there is something weird with the CComPtr, but I cannot figure out what's wrong.

I've added two header files in the bottom of my stdafx.h as following:

#include <streams.h>
#include <atlbase.h>

And I'll list part of my CIceBaseLivestreamPlayerCore.h and CIcePlayAndSaveAXCore.h as below, all the involved lines in the above errors are all included.

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*);
};

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;
};

Additional dependencies of my project is "strmbasd.lib;winmm.lib;uuid.lib;".

That's all.. Hope someone can give me the answer of how to solve it, or just gives me any advice or suggestion as a direction of what I should do.

Any help is appreciated.

And this is my first time to post an English question (I'm not a native speaker though..), so please let me know if I've anything lost or done something wrong as asking a question.

Thanks a lot. :)

Upvotes: 2

Views: 3388

Answers (1)

Ping Fang Chiang
Ping Fang Chiang

Reputation: 123

After many times of trying I finally found the problem and got it solved.

I think I should put the result here, for there might be someone who has the same problem, and is not knowing how to solve it like I was. I don't know if it's an etiquette offense of stackoverflow to answer my own question, so I will left this answer unaccepted.

As I've said, I've put #define <atlbase.h> into the bottom of my stdafx.h. But because I'm making a MFC ActiveX control project, the IDE (VS 2010) auto generates a #define statement into my stdafx.h, which is #define _ATL_NO_AUTOMATIC_NAMESPACE.

And when we use #include <atlbase.h> in ordinary times, the compiler will perform using namespace ATL by default, but this #define _ATL_NO_AUTOMATIC_NAMESPACE statement cancels this behavior, which then caused the naming conflict that my compiler had said.

So, in this case, just use ATL::CComPtr for declarations or directly use using ATL::CComPtr statement in which CComPtr appears, and this compilation error will be eliminated.

Upvotes: 7

Related Questions