Consider the following code:
class A {
virtual void foo() = 0;
};
template <template <typename... Ts> class SubA, typename... Ts>
class Helper : public A {
static void bar();
virtual void foo() override final {
return bar();
}
};
template <typename T>
class NiceA : Helper<NiceA, T> { };
This compiles. Edit: If I now add:
template <>
void Helper<NiceA, int>::bar()
{
std::cout << "Hi." << std:: endl;
}
this explicit instantiation compiles. But if I add instead:
template <typename T>
void Helper<NiceA, T>::bar()
{
std::cout << "Hi." << std:: endl;
}
this fails with the error:
a.cpp:22:28: error: invalid use of incomplete type ‘class Helper<NiceA, T>’
void Helper<NiceA, T>::bar()
^
a.cpp:10:7: error: declaration of ‘class Helper<NiceA, T>’
class Helper : public A {
^
Why?
Note: Compiling with gcc 4.9.3.