In my experimentation with templates I've come across a confusing predicament. I'm defining a templated struct F
who default argument is int
. It has a templated member function g
. I'm defining it below the struct definition. I figured this was the correct way to go about it, however, I receive an error. And only one error:
prog.cpp:9:62: error: default argument for template parameter for class enclosing 'void F< >::g()'
template <typename = int> struct F {
template <typename> void g();
};
template <typename T = int> template <typename> void F<T>::g() {}
int main() {
F<>f;
}
It's quite vague. I couldn't exactly understand what it means. So I tried changing some things around. I figured it was the default template arguments for the definition of F
. So I changed:
template <typename = int> struct F {
to
template <typename T = int> struct F {
I also tried giving g
template arguments:
template <typename T = int> template <typename U> void F<T>::g<U>() {}
But then I received the errors:
prog.cpp:9:67: error: function template partial specialization 'g' is not allowed
prog.cpp:9:67: error: default argument for template parameter for class enclosing 'void F::g()'
I even tried specifying that g
was a template function:
template <typename T = int> template <typename U> void F<T>::template g<U>() {}
But it didn't help. What am I doing wrong?
Default template parameters must be used only on function declarations, not on definitions:
template <typename T/* = int*/> template <typename> void F<T>::g() {}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With