Trouble with member function accepting template function pointer
I'm trying to create a member method on my array
class for sorting. I typedef'd two function pointers in my class one for a generic sorting method, and the other for the comparator. I'm having trouble navigating through the errors to determine exactly what is wrong with the way I'm calling it. I hope I've provided enough information, but here's what I got.
The error I'm getting:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:222:67: error: no matching function for call to ‘array<int>::sort(<unresolved overloaded function type>, <unresolved overloaded function type>)’
sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
^
main.cpp:55:6: note: candidate: void array<T>::sort(array<T>::p_sort_func, array<T>::p_comparator_func) [with T = int; array<T>::p_sort_func = void (*)(array<int>&, bool (*)(int, int)); array<T>::p_comparator_func = bool (*)(int, int)]
void array<T>::sort(array<T>::p_sort_func sort_func,
^~~~~~~~
main.cpp:55:6: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘array<int>::p_sort_func {aka void (*)(array<int>&, bool (*)(int, int))}’
I'm defining my typedefs
here:
template <typename T>
class array {
public:
typedef bool (*p_comparator_func)(T a, T b);
typedef void (*p_sort_func)(class array<T> &array, p_comparator_func);
...
void sort(array::p_sort_func sort_func,
array::p_comparator_func comparator_func);
...
}
My implementation of sort:
template <typename T>
void array<T>::sort(array<T>::p_sort_func sort_func,
array<T>::p_comparator_func comparator_func)
{
if(comparator_func == nullptr) {
comparator_func = this->default_comparator;
}
if(sort_func == nullptr) {
sort_func = this->default_sort;
}
sort_func(*this, comparator_func);
}
The sort function I am passing:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
My custom comparator:
template <typename T>
bool custom_comparator(T a, T b)
{
return a < b;
}
And where I'm calling it in main:
class array<int> a(5);
a[0] = 8;
a[1] = 6;
a[2] = 7;
a[3] = 1;
a[4] = 3;
std::cout << "attempting sort" << std::endl;
a.sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
c++
add a comment |
I'm trying to create a member method on my array
class for sorting. I typedef'd two function pointers in my class one for a generic sorting method, and the other for the comparator. I'm having trouble navigating through the errors to determine exactly what is wrong with the way I'm calling it. I hope I've provided enough information, but here's what I got.
The error I'm getting:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:222:67: error: no matching function for call to ‘array<int>::sort(<unresolved overloaded function type>, <unresolved overloaded function type>)’
sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
^
main.cpp:55:6: note: candidate: void array<T>::sort(array<T>::p_sort_func, array<T>::p_comparator_func) [with T = int; array<T>::p_sort_func = void (*)(array<int>&, bool (*)(int, int)); array<T>::p_comparator_func = bool (*)(int, int)]
void array<T>::sort(array<T>::p_sort_func sort_func,
^~~~~~~~
main.cpp:55:6: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘array<int>::p_sort_func {aka void (*)(array<int>&, bool (*)(int, int))}’
I'm defining my typedefs
here:
template <typename T>
class array {
public:
typedef bool (*p_comparator_func)(T a, T b);
typedef void (*p_sort_func)(class array<T> &array, p_comparator_func);
...
void sort(array::p_sort_func sort_func,
array::p_comparator_func comparator_func);
...
}
My implementation of sort:
template <typename T>
void array<T>::sort(array<T>::p_sort_func sort_func,
array<T>::p_comparator_func comparator_func)
{
if(comparator_func == nullptr) {
comparator_func = this->default_comparator;
}
if(sort_func == nullptr) {
sort_func = this->default_sort;
}
sort_func(*this, comparator_func);
}
The sort function I am passing:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
My custom comparator:
template <typename T>
bool custom_comparator(T a, T b)
{
return a < b;
}
And where I'm calling it in main:
class array<int> a(5);
a[0] = 8;
a[1] = 6;
a[2] = 7;
a[3] = 1;
a[4] = 3;
std::cout << "attempting sort" << std::endl;
a.sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
c++
add a comment |
I'm trying to create a member method on my array
class for sorting. I typedef'd two function pointers in my class one for a generic sorting method, and the other for the comparator. I'm having trouble navigating through the errors to determine exactly what is wrong with the way I'm calling it. I hope I've provided enough information, but here's what I got.
The error I'm getting:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:222:67: error: no matching function for call to ‘array<int>::sort(<unresolved overloaded function type>, <unresolved overloaded function type>)’
sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
^
main.cpp:55:6: note: candidate: void array<T>::sort(array<T>::p_sort_func, array<T>::p_comparator_func) [with T = int; array<T>::p_sort_func = void (*)(array<int>&, bool (*)(int, int)); array<T>::p_comparator_func = bool (*)(int, int)]
void array<T>::sort(array<T>::p_sort_func sort_func,
^~~~~~~~
main.cpp:55:6: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘array<int>::p_sort_func {aka void (*)(array<int>&, bool (*)(int, int))}’
I'm defining my typedefs
here:
template <typename T>
class array {
public:
typedef bool (*p_comparator_func)(T a, T b);
typedef void (*p_sort_func)(class array<T> &array, p_comparator_func);
...
void sort(array::p_sort_func sort_func,
array::p_comparator_func comparator_func);
...
}
My implementation of sort:
template <typename T>
void array<T>::sort(array<T>::p_sort_func sort_func,
array<T>::p_comparator_func comparator_func)
{
if(comparator_func == nullptr) {
comparator_func = this->default_comparator;
}
if(sort_func == nullptr) {
sort_func = this->default_sort;
}
sort_func(*this, comparator_func);
}
The sort function I am passing:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
My custom comparator:
template <typename T>
bool custom_comparator(T a, T b)
{
return a < b;
}
And where I'm calling it in main:
class array<int> a(5);
a[0] = 8;
a[1] = 6;
a[2] = 7;
a[3] = 1;
a[4] = 3;
std::cout << "attempting sort" << std::endl;
a.sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
c++
I'm trying to create a member method on my array
class for sorting. I typedef'd two function pointers in my class one for a generic sorting method, and the other for the comparator. I'm having trouble navigating through the errors to determine exactly what is wrong with the way I'm calling it. I hope I've provided enough information, but here's what I got.
The error I'm getting:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:222:67: error: no matching function for call to ‘array<int>::sort(<unresolved overloaded function type>, <unresolved overloaded function type>)’
sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
^
main.cpp:55:6: note: candidate: void array<T>::sort(array<T>::p_sort_func, array<T>::p_comparator_func) [with T = int; array<T>::p_sort_func = void (*)(array<int>&, bool (*)(int, int)); array<T>::p_comparator_func = bool (*)(int, int)]
void array<T>::sort(array<T>::p_sort_func sort_func,
^~~~~~~~
main.cpp:55:6: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘array<int>::p_sort_func {aka void (*)(array<int>&, bool (*)(int, int))}’
I'm defining my typedefs
here:
template <typename T>
class array {
public:
typedef bool (*p_comparator_func)(T a, T b);
typedef void (*p_sort_func)(class array<T> &array, p_comparator_func);
...
void sort(array::p_sort_func sort_func,
array::p_comparator_func comparator_func);
...
}
My implementation of sort:
template <typename T>
void array<T>::sort(array<T>::p_sort_func sort_func,
array<T>::p_comparator_func comparator_func)
{
if(comparator_func == nullptr) {
comparator_func = this->default_comparator;
}
if(sort_func == nullptr) {
sort_func = this->default_sort;
}
sort_func(*this, comparator_func);
}
The sort function I am passing:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
My custom comparator:
template <typename T>
bool custom_comparator(T a, T b)
{
return a < b;
}
And where I'm calling it in main:
class array<int> a(5);
a[0] = 8;
a[1] = 6;
a[2] = 7;
a[3] = 1;
a[4] = 3;
std::cout << "attempting sort" << std::endl;
a.sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);
c++
c++
edited Nov 12 '18 at 5:18
asked Nov 12 '18 at 5:10
jacob
2,3991421
2,3991421
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
The problem specifically was with:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
Instead of class
I should have used typename
as described in this nice article all about typename
here.
So the fixed version would be:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
typename array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53256243%2ftrouble-with-member-function-accepting-template-function-pointer%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
The problem specifically was with:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
Instead of class
I should have used typename
as described in this nice article all about typename
here.
So the fixed version would be:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
typename array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
add a comment |
The problem specifically was with:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
Instead of class
I should have used typename
as described in this nice article all about typename
here.
So the fixed version would be:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
typename array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
add a comment |
The problem specifically was with:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
Instead of class
I should have used typename
as described in this nice article all about typename
here.
So the fixed version would be:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
typename array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
The problem specifically was with:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
class array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
Instead of class
I should have used typename
as described in this nice article all about typename
here.
So the fixed version would be:
template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
typename array<T>::p_comparator_func comparator)
{
insertion_sort_recursive(array, array.get_capacity(), comparator);
}
answered Nov 12 '18 at 7:01
jacob
2,3991421
2,3991421
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53256243%2ftrouble-with-member-function-accepting-template-function-pointer%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown