BUG: C2964 On Pointer-To-Member As Template Argument

This article has been archived. It is offered "as is" and will no longer be updated.
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
This C++ language feature has not yet been implemented in Visual C++.
To not use the pointer-to-member as a template argument, pass it as a parameter to the class constructor.
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 BUGstruct 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// WORKAROUNDstruct 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				

Article ID: 249045 - Last Review: 01/10/2015 12:19:29 - Revision: 2.0

  • kbnosurvey kbarchive kbbug kbcompiler kbcpponly kblangcpp kbpending kbtemplate KB249045