In C++, a function template specialization is supposed to act exactly like a normal function. Does that mean that I can make one virtual?
For example:
struct A
{
template <class T> void f();
template <> virtual void f<int>() {}
};
struct B : A
{
template <class T> void f();
template <> virtual void f<int>() {}
};
int main(int argc, char* argv[])
{
B b;
A& a = b;
a.f<int>();
}
Visual Studio 2005 gives me the following error:
fatal error C1001: An internal error has occurred in the compiler.
As others have noted, this is not legal code because a member function template cannot be declared
virtual
.Yet even Visual Studio 2012 chokes on this: Click here for full size
Event logs indicate that the compiler crashed on
0xC0000005
, orSTATUS_ACCESS_VIOLATION
. It's funny how a certain (illegal) code construct can make the compiler segfault...Nice compiler error. For this type of checks I always fallback to the Comeau compiler before going back to the standard and checking.
Now, as it has been posted by another user, the fact is that the standard does not allow you to define virtual templated methods. The rationale is that for all virtual methods, an entry must be reserved in the vtable. The problem is that template methods will only be defined when they have been instantiated (used). This means that the vtable would end up having a different number of elements in each compilation unit, depending on how many different calls to f() with different types happen. Then hell would be raised...
If what you want is a templated function on one of its arguments and one specific version being virtual (note the part of the argument) you can do it:
If you want this generalized for any type, then you are out of luck. Consider another type of delegation instead of polymorphism (aggregation + delegation could be a solution). More information on the problem at hand would help in determining a solution.
According to http://www.kuzbass.ru:8086/docs/isocpp/template.html ISO/IEC 14882:1998:
Example: