Connecting Tech Pros Worldwide Help | Site Map

Parameter / argument mismatch in template scenario

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 22nd, 2005, 08:59 AM
Dave
Guest
 
Posts: n/a
Default Parameter / argument mismatch in template scenario


Hello all,

I hope the context to my problem shown below is adequate but not
overwhelming. I tried to keep it minimal.

At the line indicated (in comment form) in the source below, the following
error is occurring (VC++ 7.1):
error C2663: 'std::_Tree<_Traits>::find' : 2 overloads have no legal
conversion for 'this' pointer

In Comeau speak:
error: argument of type ... is incompatible with parameter of type ...

If I change part of the line in question to:
((T1 *) &node)

everything works fine (both platforms). However, I may not use the
C++-style casts here - failure still occurs in that case.

Does anybody have nay idea what might be going on?

Thanks,
Dave


// Class declaration:
template <int n>
class repeated_state_checker_t
{
public:
template <typename T1, typename T2>
bool seen_before(
const T1 &node,
const std::set<T1 *, T2> &all_nodes_sorted
) const;
};

// Definition of class full specialization:
template <>
class repeated_state_checker_t<4>
{
public:
template <typename T1, typename T2>
bool seen_before(
const T1 &node,
const std::set<T1 *, T2> &all_nodes_sorted
) const
{
if (all_nodes_sorted.find(&node) != all_nodes_sorted.end()) //
***** ERROR HERE *****
return true;
else
return false;
} // repeated_state_checker_t<4>::seen_before
};

// The class above is a template parameter to my main class; my main class
inherits from the
// template parameter and attempts to invoke the seen_before() method of the
base
// subobject as follows:
REPEATED_STATE_CHECKER::seen_before(
new_node,
all_nodes_sorted
)

// Definition of the type of new_node is shown below. This struct is
embedded in a class template and references
// some of that class template's template parameters.
struct node_t
{
node_t(
const STATE_T &state_p,
int depth_p,
int cost_to_reach_p,
const node_t *parent_p = NULL,
const OP_T &op_p = OP_T()
):
state(state_p),
depth(depth_p),
cost_to_reach(cost_to_reach_p),
parent(parent_p),
op(op_p)
{
}

STATE_T state;
int depth;
int cost_to_reach;
const node_t *parent; // Equals NULL for root node
OP_T op; // Meaningful only if parent !=
NULL
};

// Definition of all_nodes_sorted:
std::set<node_t *, node_sort_t> all_nodes_sorted;

// Definition of node_sort_t:
class node_sort_t
{
public:
bool operator()(const node_t *lhs, const node_t *rhs) const
{
return (lhs->state < rhs->state);
}
};



  #2  
Old July 22nd, 2005, 09:00 AM
Alf P. Steinbach
Guest
 
Posts: n/a
Default Re: Parameter / argument mismatch in template scenario

* "Dave" <better_cs_now@yahoo.com> schriebt:[color=blue]
>
> I hope the context to my problem shown below is adequate but not
> overwhelming. I tried to keep it minimal.[/color]

There's much that's irrelevant, yes. ;-)

[color=blue]
> In Comeau speak:
> error: argument of type ... is incompatible with parameter of type ...
>
> If I change part of the line in question to:
> ((T1 *) &node)
>
> everything works fine (both platforms). However, I may not use the
> C++-style casts here - failure still occurs in that case.[/color]

You may technically use the C++ casts, specifically const_cast.


[color=blue]
> Does anybody have nay idea what might be going on?[/color]

Yes, almost everybody have nay idea what might be going on.

[color=blue]
> // Class declaration:
> template <int n>
> class repeated_state_checker_t
> {
> public:
> template <typename T1, typename T2>
> bool seen_before(
> const T1 &node,
> const std::set<T1 *, T2> &all_nodes_sorted[/color]

Make that


std::set<T1 const*, T2>& all_nodes_sorted


or even better use a typedef'ed name.

[color=blue]
> ) const;
> };
>
> // Definition of class full specialization:
> template <>
> class repeated_state_checker_t<4>
> {
> public:
> template <typename T1, typename T2>
> bool seen_before(
> const T1 &node,
> const std::set<T1 *, T2> &all_nodes_sorted
> ) const
> {
> if (all_nodes_sorted.find(&node) != all_nodes_sorted.end()) //
> return true;
> else
> return false;[/color]

Make that


return (all_nodes_sorted.find(&node) != all_nodes_sorted.end());


[color=blue]
> } // repeated_state_checker_t<4>::seen_before
> };[/color]

--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
  #3  
Old July 22nd, 2005, 09:00 AM
Alf P. Steinbach
Guest
 
Posts: n/a
Default Re: Parameter / argument mismatch in template scenario

* "Dave" <better_cs_now@yahoo.com> schriebt:[color=blue]
>
> I hope the context to my problem shown below is adequate but not
> overwhelming. I tried to keep it minimal.[/color]

There's much that's irrelevant, yes. ;-)

[color=blue]
> In Comeau speak:
> error: argument of type ... is incompatible with parameter of type ...
>
> If I change part of the line in question to:
> ((T1 *) &node)
>
> everything works fine (both platforms). However, I may not use the
> C++-style casts here - failure still occurs in that case.[/color]

You may technically use the C++ casts, specifically const_cast.


[color=blue]
> Does anybody have nay idea what might be going on?[/color]

Yes, almost everybody have nay idea what might be going on.

[color=blue]
> // Class declaration:
> template <int n>
> class repeated_state_checker_t
> {
> public:
> template <typename T1, typename T2>
> bool seen_before(
> const T1 &node,
> const std::set<T1 *, T2> &all_nodes_sorted[/color]

Make that


std::set<T1 const*, T2>& all_nodes_sorted


or even better use a typedef'ed name.

[color=blue]
> ) const;
> };
>
> // Definition of class full specialization:
> template <>
> class repeated_state_checker_t<4>
> {
> public:
> template <typename T1, typename T2>
> bool seen_before(
> const T1 &node,
> const std::set<T1 *, T2> &all_nodes_sorted
> ) const
> {
> if (all_nodes_sorted.find(&node) != all_nodes_sorted.end()) //
> return true;
> else
> return false;[/color]

Make that


return (all_nodes_sorted.find(&node) != all_nodes_sorted.end());


[color=blue]
> } // repeated_state_checker_t<4>::seen_before
> };[/color]

--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
  #4  
Old July 22nd, 2005, 09:00 AM
Martin Eisenberg
Guest
 
Posts: n/a
Default Re: Parameter / argument mismatch in template scenario

Dave wrote:
[color=blue]
> template <typename T1, typename T2>
> bool seen_before(
> const T1 &node,
> const std::set<T1 *, T2>
> &all_nodes_sorted
> ) const
> {
> if (all_nodes_sorted.find(&node) !=
> all_nodes_sorted.end()) // ***** ERROR HERE *****
> return true;
> else
> return false;
> }[/color]

The problem is that &node is const T1*
while find expects a non-const pointer.


Martin

--
Quidquid latine dictum sit, altum viditur.
  #5  
Old July 22nd, 2005, 09:00 AM
Martin Eisenberg
Guest
 
Posts: n/a
Default Re: Parameter / argument mismatch in template scenario

Dave wrote:
[color=blue]
> template <typename T1, typename T2>
> bool seen_before(
> const T1 &node,
> const std::set<T1 *, T2>
> &all_nodes_sorted
> ) const
> {
> if (all_nodes_sorted.find(&node) !=
> all_nodes_sorted.end()) // ***** ERROR HERE *****
> return true;
> else
> return false;
> }[/color]

The problem is that &node is const T1*
while find expects a non-const pointer.


Martin

--
Quidquid latine dictum sit, altum viditur.
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,840 network members.