我正在尝试实现自己的Set模板,并尝试使用独立运行的队列模板进行广度优先搜索。
奇怪的是,我在尝试编译时在我的Set模板中收到此错误。为什么它不能从一个指针转换为同一数据类型的另一个指针?
error C2440: '=' : cannot convert from 'Set<T>::Node<T> *' to 'Set<T>::Node<T> *'
with
[
T=std::string
]
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
c:\users\programming\Set\Set.h(96) : while compiling class template member function 'void Set<T>::print(Set<T>::Node<T> *)'
with
[
T=std::string
]
c:\users\programming\Set\main.cpp(13) : see reference to class template instantiation 'Set<T>' being compiled
with
[
T=std::string
]
队列类模板
template <typename T>
class Queue
...
T* front()
{
if (first != NULL)
return first->item;
else
return NULL;
}
设置类模板
template <typename T>
Class Set
...
Queue<Node<T> *> q;
void print(Node<T> *p)
{
q.push(p);
while (p != NULL)
{
cout << p->item << "(" << p->height << ") ";
if (p->left != NULL)
q.push(p->left);
if (p->right != NULL)
q.push(p->right);
if (!q.size())
{
// Error is at this line
p = q.front();
q.pop();
}
else
p = NULL;
}
cout << endl;
}
答案 0 :(得分:2)
您的Queue
类已经使用Node<T>*
类型进行实例化...然后您尝试从T
方法返回指向类型Queue<T>::front
的指针。如果您使用Queue<T>
即时关闭T=Node<T>*
课程,则只需从T
方法返回front
类型,而不是T*
。因此,请将front
方法签名更改为以下内容:
template <typename T>
class Queue
...
T front()
{
if (first != NULL)
return first->item;
else
return NULL;
}
现在,如果T
不是指针类型,这可能会导致一系列问题...因此,您可能希望针对Queue<T>::front
的情况创建T
方法的专门化已经是一个指针类型。例如:
//pointer-type specialization
template<typename T>
T Queue<T*>::front()
{
if (first != NULL)
return first->item;
else
return NULL;
}
//non-specialized version where T is not a pointer-type
template<typename T>
T* Queue<T>::front()
{
if (first != NULL)
return &(first->item);
else
return NULL;
}