FIX: C2676 on Overloaded Operators of Templated ClassesLast reviewed: September 18, 1997Article ID: Q130370 |
2.00 2.10 2.20
WINDOWS NT
kbtool kbfixlist
The information in this article applies to:
SYMPTOMSWhen a templated class is not instantiated, but its member operators are referenced, the following error is generated:
error C2676: [binary/unary] '<op>' : 'class [ClassName]<temp type>' does not define this operator or a conversion to a type acceptable to the predefined operator.NOTE: The line number referenced by the error message refers to the point where the operator is referenced (called), not the operator's definition.
RESOLUTIONThe template class must be instantiated for the particular data type being referenced (< class T> below). This instantiation can be accomplished in one of two ways:
STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was fixed in Microsoft Visual C++, 32-bit Edition, version 4.0.
MORE INFORMATIONIn the sample code below, the "*" operator has been chosen to reproduce the problem, but the problem occurs with both binary and unary (prefix or postfix) operators. In all cases, the workarounds are the same. The return type of the operator function has no bearing on the problem. NOTE: If the operator is the function call operator (), the error is C2604 instead of C2676, but the workarounds are the same.
Sample Code
/* Compile Options Needed: None */template< class T > class TmpltClass { T X; public: T& operator*(int Arg1) {return X;}};
// Workaround 1: uncomment any one of the following three lines: // TmpltClass<int> X; // extern TmpltClass<int> X; // template TmpltClass<int>; void test(TmpltClass<int>& theArg){ // Workaround 2: uncomment the next line: // theArg.operator*(0); theArg * 0; //do not comment out this line}
|
Additional reference words: 2.00 2.10 2.20 9.00 9.10
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |