FIX: C2321 Expanding Template with a Pointer to a Nested Class
ID: Q150885
|
The information in this article applies to:
-
The C/C++ Compiler (CL.EXE), used with:
-
Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1, 4.2, 5.0
SYMPTOMS
At the point where a class template is expanded using the new operator
to a nested class, the compiler reports the following errors:
[FileName](10) : error C2321: syntax error : unexpected 'A::B'
[FileName](27) : fatal error C1004: unexpected end of file found
STATUS
This bug was corrected in Microsoft Visual C++, version 6.0.
RESOLUTION
There are two possible workarounds to this problem. Each is stated in terms
of the sample code below:
- Remove t(new T()) from the initializer list and add t = new T(); to the
body of the constructor. This workaround assumes class T is not a
reference or a constant pointer.
- Change the definitions of class A and class B so that B is no longer
nested in the definition of A.
Sample Code
/* Compile options needed: None */
template <class T> class C
{
public:
C();
private:
T *t;
};
template <class T> C<T>::C() : t(new T()) // error
{
}
lass A
{
public:
class B
{
};
};
main()
{
C<A::B> c;
return 0;
}
Additional query words:
Keywords : kbnokeyword kbVC400bug kbVC410bug kbVC420bug kbVC500bug kbVC600fix
Version : winnt:4.0,4.1,4.2,5.0
Platform : winnt
Issue type : kbbug