整容说文库 > 程序代码 > 教育资讯

error C2440: 'return' : cannot convert from 'int (__thiscall Node::*)(void)' to 'int'

来源:学生作业帮助网 编辑:整容说文库 时间:2019/08/21 03:22:52 程序代码
error C2440: 'return' : cannot convert from 'int (__thiscall Node::*)(void)' to 'int'程序代码
这几天刚学数据结构,写个list不知出的什么错
// Node.h: interface for the Node class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_NODE_H__F80768F4_AAFA_4326_B0CC_AFBC1688873E__INCLUDED_)
#define AFX_NODE_H__F80768F4_AAFA_4326_B0CC_AFBC1688873E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
template <class T>
class Node  
{
public:
Node(T v=NULL);
virtual ~Node();
Node<T>* nextNode();
T getValue();
void setValue(T item);
void setNext(Node* n);
private:
T value;
Node* next;

};

template <class T> Node<T>::Node(T v){
value=v;
}

template <class T> Node<T>::~Node(){
//do something here
}

template <class T> Node<T>* Node<T>::nextNode(){
return next;
}

template <class T> T Node<T>::getValue(){
return value;
}

template <class T> void Node<T>::setNext(Node* n){
next=n;
}

template <class T> void Node<T>::setValue(T item){
value=item;
}

#endif // !defined(AFX_NODE_H__F80768F4_AAFA_4326_B0CC_AFBC1688873E__INCLUDED_)


// Jlist.h: interface for the Jlist class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_JLIST_H__D29DF6E3_0D66_4EE6_8F64_57F2BF0AD4F8__INCLUDED_)
#define AFX_JLIST_H__D29DF6E3_0D66_4EE6_8F64_57F2BF0AD4F8__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "Node.h"
#include "Iterator.h"

template <class T>
class Jlist  
{
public:
Jlist();
virtual ~Jlist();
void add(T item);
void add(int i,T item);
void set(int i,T item);
T get(int i);
int size();
int indexOf(T item);
bool remove(int i);
bool contains(T item);
void clear();
void sort();
Iterator<T> iterator();
private:
Node<T>* head;
int len;
};

template <class T> Jlist<T>::Jlist(){
head=new Node<T>();
len=0;
}

template <class T> Jlist<T>::~Jlist(){
clear();
delete head;
}

template <class T> void Jlist<T>::add(T item){
add(len,item);
}

template <class T> void Jlist<T>::add(int i,T item){
Node<T>* node=head;
Node<T>* n=new Node<T>(item);
for(int j=0;j<i;j++){
node=node->nextNode();
}
n->setNext(node->nextNode());
node->setNext(n);
len++;
}

template <class T> void Jlist<T>::set(int i,T item){
Node<T>* node=head;
for(int j=0;j<i+1;j++){
node=node->nextNode();
}
node->setValue(item);
}

template <class T> T Jlist<T>::get(int i){
Node<T>* node=head;
for(int j=0;j<i+1;j++){
node=node->nextNode();
}
return node->getValue();
}

template <class T> int Jlist<T>::size(){
return len;
}

template <class T> bool Jlist<T>::remove(int i){
if(i<0||i>=len)return false;
Node<T>* node=head;
for(int j=0;j<i;j++){
node=node->nextNode();
}
Node<T>* node0=node->nextNode();
node->setNext(node0->nextNode());
delete node0;
len--;
return true;
}

template <class T> void Jlist<T>::clear(){
if(len)return;
Node<T>* n=head->nextNode();
Node<T>* m;
for(;len>1;len--){
m=n->nextNode();
delete n;
n=m;
}
delete n;
len=0;
}

template <class T> void Jlist<T>::sort(){
//
}

template <class T> bool Jlist<T>::contains(T item){
return indexOf(item)!=-1;
}

template <class T> int Jlist<T>::indexOf(T item){
Node<T>* node=head;
for(int j=0;j<len;j++){
node=node->nextNode();
if(node->getValue()==item){
delete node;
return j;
}
}
delete node;
return -1;
}

template <class T> Iterator<T> Jlist<T>::iterator(){
Iterator<T> it(head,len);
return it;
}

#endif // !defined(AFX_JLIST_H__D29DF6E3_0D66_4EE6_8F64_57F2BF0AD4F8__INCLUDED_)


// Iterator.h: interface for the Iterator class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ITERATOR_H__571B943F_865B_4C1C_9381_B9CFBE84DF86__INCLUDED_)
#define AFX_ITERATOR_H__571B943F_865B_4C1C_9381_B9CFBE84DF86__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "Node.h"

template <class T>
class Iterator 
{

public:
Iterator(Node<T>* h,int l):current(h),len(l){};
virtual ~Iterator(){};
bool hasNext();
T next();
private:
Node<T>* current;
int cursor;
int len;
};

template <class T> bool Iterator<T>::hasNext(){
if(cursor<len)return true;
delete current;
return false;
}

template <class T> T Iterator<T>::next(){
current=current->nextNode();
return current->getValue;
}

#endif // !defined(AFX_ITERATOR_H__571B943F_865B_4C1C_9381_B9CFBE84DF86__INCLUDED_)



// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Jlist.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
Jlist<int> jlist;
for(int i=0;i<4;i++){
jlist.add(i);
}
jlist.set(2,int(8));
jlist.remove(1);
cout<<jlist.size();
cout<<jlist.indexOf(int(8));
Iterator<int> it=jlist.iterator();
while(it.hasNext())cout<<it.next();
return 0;
}
具体出错信息:
Compiling...
test.cpp
c:\program files\microsoft visual studio\myprojects\jlist\iterator.h(37) : error C2440: 'return' : cannot convert from 'int (__thiscall Node<int>::*)(void)' to 'int'
        Conversion is a valid standard conversion, which can be performed implicitly or by use of static_cast, C-style cast or function-style cast
        c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function 'int __thiscall Iterator<int>::next(void)'
Error executing cl.exe.

test.obj - 1 error(s), 0 warning(s)
我把4大cast都用了一遍,全都不行
感觉要是有什么方法能把Jlist<T>的T传给Iterator问题就迎刃而解了
楼主我 在vc6下顺利编译通过·
偶忘了说了
我是vc6+sp6+inter c++

我只在你Node.h里面加上了 #include <stdio.h>
因为不能识别 NULL,所以。。
欢迎发消息给我讨论:

wanfustudio@mail.csdn.net
wanfu.liu@hotmail.com
q:119451814
定义一下NULL
return current->getValue; -> return current->getValue();
哦,对了,
楼上说的那个return current->getvalue;那个我忘了说了~

综合一下就可以编译通过了~!
return current->getValue;
=>
return current->getValue();
哦,原来如此,终于编译通过了
追加个问题:有没有什么方法能实现让Iterator成为Jlist的Iterator呢
就是Iterator it=jlist.iterator()不要<T>就像内部类吧(不好意思,这个问题只能给1分了)
9点之前我会结贴
不会吧,没分就没人回
程序代码