BUG: C2964 On Pointer-To-Member As Template Argument (249045)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0

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
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbBug kbCompiler kbCPPonly kbLangCPP kbpending kbtemplate KB249045