Calling template function within template class
Disclaimer: The following question probably is so easy that I might be shocked seeing the first answer. Furthermore, I want to apologize for any duplicate questions - syntactic problems are not always easy to identify be verbal explanation and thus searching for them is not as easy...
But enough of that. I have a two templated classes, one of those has a templated member function, the other class attempts to call that function. A minimal, error producing example is shown below:
#include <iostream>
template <typename T>
class Foo {
public:
Foo() {
}
template <typename o开发者_开发知识库uttype>
inline outtype bar(int i, int j, int k = 1) {
return k;
}
};
template <typename T>
class Wrapper {
public:
Wrapper() {
}
double returnValue() {
Foo<T> obj;
return obj.bar<double>(1,2); // This line is faulty.
}
};
int main() {
Wrapper<char> wr;
double test = wr.returnValue();
std::cout << test << std::endl;
return 0;
}
At compile time, this results in
expected primary-expression before 'double'
expected ';' before 'double'
expected unqualified-id before '>' token
where all error messages are directed at the linke marked in the code.
I allready thank you for your ideas, no matter how obvious they are.
obj.bar<double>(1,2); // This line is faulty.
The template
keyword is required here, as obj
is an instance of a type Foo<T>
which depends on the template parameter T
, and so the above should be written as:
obj.template bar<double>(1,2); //This line is corrected :-)
Read @Johannes's answer here for detail explanation:
- Where and why do I have to put the "template" and "typename" keywords?
As so often: Once the question was posted, the answer came all by itself. Correcting the faulty line to
return obj.template bar<double>(1,2);
yields the expected results.
Thanks for reading...
Could this be a case of foo.template bar‹ double >
?
精彩评论