• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 505
  • Last Modified:

CArray of CArray

Hi all,
    I'm trying to make a CArray of CArrays

CArray <CArray<long, long>, CArray<long, long> > testaArray;

But it does'nt work... always these errors:

error C2146: syntax error : missing ',' before identifier 'test'
C:\Tomoview 1.4R8\TVM\DovetailAutomaticAnalysis\DovetailAutomaticAnalysisDlg.cpp(3160) : error C2065: 'test' : undeclared identifier
C:\Tomoview 1.4R8\TVM\DovetailAutomaticAnalysis\DovetailAutomaticAnalysisDlg.cpp(3160) : error C2143: syntax error : missing '>' before ';'

Can someone help?...thanks
0
David MacDonald
Asked:
David MacDonald
  • 4
  • 4
  • 4
  • +2
1 Solution
 
tvanceplusCommented:
I would use a CArray of pointers to CArray like this

CArray<CArray<long,long>*,CArray<long,long>*&> testaArray;

then just allocate the memory yourself.
0
 
David MacDonaldChargé de projet processus d’affaires et systèmes TIAuthor Commented:
Ok, that's cool, but why a CArray of CArray (not pointers) is not working?...


Also, why is it that when we pass a CArray as a function parameter, we have to write CArray<something, something>& ...

It's the '&' i'm wondering about...
0
 
jkrCommented:
That's strange - your code is compiling fine here:

#include <afxtempl.h>

CArray <CArray<long, long>, CArray<long, long> > testaArray;


typedef CArray<long,long> CLongArray;
typedef CArray<CLongArray, CLongArray> CLAA;

CLAA aa;

Did you forget '#include <afxtempl.h>'?
0
Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

 
David MacDonaldChargé de projet processus d’affaires et systèmes TIAuthor Commented:
i'll try that out.... but I can declare a simple CArray with no trouble...

I'll be back on that...
0
 
David MacDonaldChargé de projet processus d’affaires et systèmes TIAuthor Commented:
OK, now i am confused.... I just retried it... and it works ok......................

dunno why...  since my problem is no more, here is a quiz, a answer I wonder about for a time now....

why is it that when we pass a CArray as a function parameter, we have to write CArray<something,
something>& ...

It's the '&' i'm wondering about...


Thanks for all the support in my "mysterious problem..."
0
 
jkrCommented:
>>we have to write CArray<something, something>& ...

That's because if you wrote 'CArray<something, something>', 'template class CArray< class _A, class _T>' would need to have a copy constructor defined (which it hasn't - there's no 'CArray< class _A, class _T>( const CArray< class _A, class _T>&)' ctor, and no 'operator=()', which would be necessary also), as you'd pass a copy of the (*WHOLE*) array to the called function - the appended '&' passes a reference to an array, and that's syntactically possible (and reasonable aso :o)
0
 
jkrCommented:
>>It's the '&' i'm wondering about...

Still wondering? :o)
0
 
peterchen092700Commented:
the "&" says you pass a reference to an object of  CArray<T1,T2> type.

Pass by reference: a reference to the object (actually, a pointer) is passed to the function. the function can manipulate the original object.

Pass by value: a copy of the object is made on stack. The function uses it's own opy of the object (can't modify the original). For larger objects, this also tends to be ineffective (due to copying the entire object rather than a pointer, and perhaps complex constructors to be called.)

need an example?

b) already answered, but: CTemplate<x> is treated as completely different class than CTemplate<y>. i.a.W. the full type name is "CTemplate<>". "CTemplate" alone is no known type.

c) guess for youroriginal problem: did you accidently forget the space beetween the two closing '>' ? btw. the error message itself loks more like you didn't #include <afxtempl.h>.

good luck
Peter


0
 
ShaunWildeCommented:
this doesn't compile

     CArray< CArray< long, long>, CArray< long, long>> x;


this does

     CArray< CArray< long, long>, CArray< long, long> > x;

spot the difference yup it is the >> at the end - as you know >> is an operator and that is what the compiler is seeing first rather then the end of two templates


0
 
ShaunWildeCommented:
oops looks like peterchen answered the first reason - teach me to get interrupted
0
 
peterchen092700Commented:
hehe.. ths time not me ;)
0
 
jkrCommented:
Hmm, if the Q is the original code, it is '> >'
0
 
ShaunWildeCommented:
> Hmm, if the Q is the original code, it is '> >'

maybe - but when I did >> instead of > > I got the same error messages
0
 
peterchen092700Commented:
might be the space was inserted by the code police template task force, which might also explain "it suddenly works".
0
 
ShaunWildeCommented:
> might be the space was inserted by the code police
> template task force, which might also explain "it
> suddenly works".

ah another believer of the code pixies
0
 
David MacDonaldChargé de projet processus d’affaires et systèmes TIAuthor Commented:
Don`t laugh about code pixies, or they will get pissed off!! :)

Thanks a lot folks, jkr gave me the explanation I sought.... thanks...

And don`t forget: beware the code pixies.... lol

0
 
peterchen092700Commented:
sure I believe in them... In fact I worked for them for almost two years.... yeah, I tell you: the excitment, the adventure.... but the paperwork was eating me up
0

Featured Post

Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

  • 4
  • 4
  • 4
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now