We started using templates this week in our CSS class, they seem fairly straight forward however, when we started diving into it in our lab, some problems we can't figure out started showing up.
We are getting the following errors:
../Lab7PartC/DLNode.cpp:13:5: error: invalid use of template-name ‘lab7::DLNode’ without an argument list
../Lab7PartC/DLNode.cpp:20:5: error: invalid use of template-name ‘lab7::DLNode’ without an argument list
../Lab7PartC/DLNode.cpp:26:5: error: expected unqualified-id before ‘template’
../Lab7PartC/DLNode.cpp:33:5: error: invalid use of template-name ‘lab7::DLNode’ without an argument list
Here is the relevant class .cpp file:
/*
* DLNode.cpp
*
* Created on: Mar 29, 2013
* Author: tony
*/
#include <cstddef>
#include "DLNode.h"
namespace lab7 {
DLNode::DLNode() {
data = 0;
next = NULL;
prev = NULL;
}
template<class T>
DLNode::DLNode(T d) {
data = d;
next = NULL;
prev = NULL;
}
template<class T>
DLNode::DLNode(T d, DLNode* n, DLNode* p) {
data = d;
next = n;
prev = p;
}
DLNode::~DLNode() {
delete next;
}
} /* namespace lab7 */
Here is the relevant .h file:
/*
* DLNode.h
*
* Created on: Mar 29, 2013
* Author: tony
*/
#ifndef DLNODE_H_
#define DLNODE_H_
namespace lab7 {
template<class T>
class DLNode {
public:
DLNode();
DLNode(T data_in);
DLNode(T data_in, DLNode* n, DLNode* p);
virtual ~DLNode();
void setNext(DLNode* n) {
next = n;
}
void setPrev(DLNode* p) {
prev = p;
}
int getData() {
return data;
}
DLNode* getNext() {
return next;
}
DLNode* getPrev() {
return prev;
}
private:
T data;
DLNode* next;
DLNode* prev;
};
} /* namespace lab7 */
#endif /* DLNODE_H_ */
We've spent the evening trying to figure it out, and appreciate any advice on the topic. Thanks.
I hate to bother you again, but I modified the header files to include the entire definition as you suggested, and this is what I have, this time I am including the additional class that uses the node class:
/*
* DLNode.h
*
* Created on: Mar 29, 2013
* Author: tony
*/
#ifndef DLNODE_H_
#define DLNODE_H_
namespace lab7 {
template<class T>
class DLNode {
public:
DLNode<T>();
DLNode<T>(T data_in);
DLNode<T>(T data_in, DLNode* n, DLNode* p);
~DLNode<T>();
void setNext<T>(DLNode* n) {
next = n;
}
void setPrev<T>(DLNode* p) {
prev = p;
}
int getData<T>() {
return data;
}
DLNode* getNext<T>() {
return next;
}
DLNode* getPrev<T>() {
return prev;
}
private:
T data;
DLNode* next;
DLNode* prev;
};
template<class T>
DLNode<T>::DLNode() {
data = 0;
next = NULL;
prev = NULL;
}
template<class T>
DLNode<T>::DLNode(T d) {
data = d;
next = NULL;
prev = NULL;
}
template<class T>
DLNode<T>::DLNode(T d, DLNode* n, DLNode* p) {
data = d;
next = n;
prev = p;
}
template<class T>
DLNode<T>::~DLNode() {
delete next;
}
} /* namespace lab7 */
#endif /* DLNODE_H_ */
--and the additional list class header file:
/*
* DLList.h
*
* Created on: Mar 29, 2013
* Author: tony
*/
#ifndef DLLIST_H_
#define DLLIST_H_
namespace lab7 {
class DLNode<T>;
template<class T>
class DLList {
public:
DLList();
virtual ~DLList();
void insert(T data);
void print();
bool search(const T key);
bool searchandremove(const T key);
void swap();
DLNode* findNode(const T key);
private:
DLNode* first;
};
template<class T>
DLList<T>::DLList() {
first = NULL;
}
template<class T>
DLList<T>::~DLList() {
delete first;
}
template<class T>
void DLList<T>::insert(T data) {
DLNode<T>* temp = first;
first = new DLNode(data, first, NULL);
if (temp == NULL)
return;
temp->setPrev(first);
}
template<class T>
void DLList<T>::print() {
DLNode* temp = first;
while (temp != NULL) {
cout << temp->getData() << " ";
temp = temp->getNext();
}
cout << endl;
}
template<class T>
bool DLList<T>::search(const T key) {
DLNode* temp = new DLNode;
bool found = false;
for (temp = first; temp != NULL; temp = temp->getNext()) {
if (temp->getData() == key)
found = true;
}
return found;
}
template<class T>
bool DLList<T>::searchandremove(const T key) {
DLNode* prev = new DLNode;
DLNode* next = new DLNode;
DLNode* toDelete = new DLNode;
toDelete = findNode(key);
if (toDelete != NULL) {
prev = toDelete->getPrev();
next = toDelete->getNext();
toDelete->setNext(NULL);
toDelete->setPrev(NULL);
if (toDelete == first) {
first = next;
next->setPrev(first);
} else {
prev->setNext(next);
if (next != NULL)
next->setPrev(prev);
}
delete toDelete;
return true;
}
return false;
}
template<class T>
DLNode* DLList<T>::findNode(const T key) {
DLNode* temp = new DLNode;
for (temp = first; temp != NULL; temp = temp->getNext()) {
if (temp->getData() == key)
return temp;
}
return NULL;
}
template<class T>
void DLList<T>::swap() {
DLNode* last = new DLNode;
//navigate to second to last node
for (last = first; last->getNext() != NULL; last = last->getNext()) {
}
last->getPrev()->setNext(first);
first->setPrev(last->getPrev());
last->setPrev(NULL);
last->setNext(first->getNext());
first->getNext()->setPrev(last);
first->setNext(NULL);
first = last;
}
} /* namespace lab7 */
#endif /* DLLIST_H_ */
This came with an additional plethora of errors I don't understand:
In file included from ../Lab7PartC/Lab7B.cpp:13:0:
../Lab7PartC/DLList.h:14:11: error: ‘DLNode’ is not a template
../Lab7PartC/DLList.h:14:18: error: ‘T’ was not declared in this scope
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::insert(T)’:
../Lab7PartC/DLList.h:43:9: error: ‘lab7::DLNode’ is not a template
../Lab7PartC/DLList.h:47:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::print()’:
../Lab7PartC/DLList.h:54:25: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:55:24: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘bool lab7::DLList<T>::search(T)’:
../Lab7PartC/DLList.h:62:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:64:53: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:65:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘bool lab7::DLList<T>::searchandremove(T)’:
../Lab7PartC/DLList.h:73:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:74:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:75:32: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:78:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:79:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:80:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:81:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:84:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:87:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:89:25: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘lab7::DLNode* lab7::DLList<T>::findNode(T)’:
../Lab7PartC/DLList.h:99:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:100:53: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:101:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::swap()’:
../Lab7PartC/DLList.h:109:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:111:32: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:111:64: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:113:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:114:14: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:114:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:115:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:116:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:116:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:117:14: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:118:14: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::insert(T) [with T = int]’:
../Lab7PartC/Lab7B.cpp:23:26: instantiated from here
../Lab7PartC/DLList.h:44:9: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘bool lab7::DLList<T>::searchandremove(T) [with T = int]’:
../Lab7PartC/Lab7B.cpp:34:32: instantiated from here
../Lab7PartC/DLList.h:91:13: warning: possible problem detected in invocation of delete operator:
../Lab7PartC/DLList.h:75:17: warning: ‘toDelete’ has incomplete type
../Lab7PartC/DLList.h:14:11: warning: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:91:13: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.
../Lab7PartC/DLList.h: In destructor ‘lab7::DLList<T>::~DLList() [with T = int]’:
../Lab7PartC/Lab7B.cpp:46:1: instantiated from here
../Lab7PartC/DLList.h:38:9: warning: possible problem detected in invocation of delete operator:
../Lab7PartC/DLList.h:38:9: warning: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: warning: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:38:9: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.