FIX: C2321 Expanding Template with a Pointer to a Nested Class (150885)
The information in this article applies to:
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Professional Edition 4.2
- Microsoft Visual C++, 32-bit Enterprise Edition 5.0
- Microsoft Visual C++, 32-bit Professional Edition 5.0
This article was previously published under Q150885 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
STATUSThis 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;
}
Modification Type: | Minor | Last Reviewed: | 7/5/2005 |
---|
Keywords: | kbBug kbfix kbVC600fix KB150885 |
---|
|