Microsoft KB Archive/249045

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Knowledge Base


Article ID: 249045

Article Last Modified on 7/5/2005



APPLIES TO

  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Standard Edition



This article was previously published under Q249045

SYMPTOMS

The compiler generates an error such as the following when a pointer-to-member is used as a class template parameter.

error C2964: invalid expression as template parameter

CAUSE

This C++ language feature has not yet been implemented in Visual C++.

RESOLUTION

To not use the pointer-to-member as a template argument, pass it as a parameter to the class constructor.

STATUS

Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.

MORE INFORMATION

Use the following sample code to reproduce the behavior:

#ifdef BUG

struct MyClass {
   char a,b;
   MyClass() : a('a'), b('b') {};
};

template<char MyClass::*member_ptr> 
class AnotherClass {
private:
   MyClass m_var;
public:
   char value() { return m_var.*member_ptr; }
};

int main()
{
   AnotherClass<&MyClass::a> var1;
   AnotherClass<&MyClass::b> var2;    //<<<< Causes compiler error.
   return 0;
} 

#else

// WORKAROUND
struct MyClass {
   char a,b;
   MyClass() : a('a'), b('b') {};
};

template<typename MbrType, typename ClassType> 
class AnotherClass {
private:
   MyClass m_var;
   MbrType ClassType::*member_ptr;
public:
   AnotherClass(MbrType ClassType::*mem_ptr) : member_ptr(mem_ptr) {}
   char value() { return m_var.*member_ptr; }
};

int main()
{
   AnotherClass<char,MyClass> var1(&MyClass::a);
   AnotherClass<char,MyClass> var2(&MyClass::b);
   return 0;
} 

#endif
                

Keywords: kbbug kblangcpp kbtemplate kbcpponly kbpending kbcompiler KB249045