如何使用提供的头文件声明对象? (缺少模板参数错误)
How do I declare an object using this provided header file? (missing template arguments error)
我的导师为我们提供了一个定义 class AvlTree 的头文件,但由于某些原因我无法在 main() 中正常声明对象。我究竟做错了什么?这是头文件的相关部分:
#ifndef AVL_TREE_H
#define AVL_TREE_H
#include <iostream> // NULL, cin, cout
using namespace std;
template <typename Comparable>
class AvlTree
{
public:
AvlTree( ) : root( NULL )
{ }
AvlTree( const AvlTree & rhs ) : root( NULL )
{
*this = rhs;
}
private:
struct AvlNode
{
Comparable element;
AvlNode *left;
AvlNode *right;
int height;
AvlNode( const Comparable & theElement, AvlNode *lt,
AvlNode *rt, int h = 0 )
: element( theElement ), left( lt ), right( rt ), height( h ) { }
};
AvlNode *root;
};
#endif
这是我在 main 中尝试做的事情:
#include "AvlTree.h"
void readFile(AvlTree &t1, AvlTree &t2)
{
// do some stuff
return;
}
void splayAccess(AvlTree &t1, AvlTree &t2)
{
// do some stuff
return;
}
int main (void)
{
// object declarations
AvlTree tree1;
AvlTree tree2;
// function calls
readFile(tree1, tree2);
splayAccess(tree1, tree2);
return 0;
}
这里是错误(GNU 编译器):
cwd0042@cse04:~/3110/hw4$ g++ header.h mcve.cpp
mcve.cpp:3:15: error: variable or field ‘readFile’ declared void
mcve.cpp:3:23: error: missing template arguments before ‘&’ token
mcve.cpp:3:24: error: ‘t1’ was not declared in this scope
mcve.cpp:3:36: error: missing template arguments before ‘&’ token
mcve.cpp:3:37: error: ‘t2’ was not declared in this scope
mcve.cpp:9:18: error: variable or field ‘splayAccess’ declared void
mcve.cpp:9:26: error: missing template arguments before ‘&’ token
mcve.cpp:9:27: error: ‘t1’ was not declared in this scope
mcve.cpp:9:39: error: missing template arguments before ‘&’ token
mcve.cpp:9:40: error: ‘t2’ was not declared in this scope
mcve.cpp: In function ‘int main()’:
mcve.cpp:18:10: error: missing template arguments before ‘tree1’
mcve.cpp:18:10: error: expected ‘;’ before ‘tree1’
mcve.cpp:19:10: error: missing template arguments before ‘tree2’
mcve.cpp:19:10: error: expected ‘;’ before ‘tree2’
mcve.cpp:22:11: error: ‘tree1’ was not declared in this scope
mcve.cpp:22:18: error: ‘tree2’ was not declared in this scope
mcve.cpp:22:23: error: ‘readFile’ was not declared in this scope
mcve.cpp:23:26: error: ‘splayAccess’ was not declared in this scope
template <typename Comparable>
class AvlTree
// ...
这声明了一个名为 AvlTree
的模板 class。此模板采用一个参数。
void readFile(AvlTree &t1, AvlTree &t2)
声明函数的语法是:
{return type} function-name( {parameter list} )
{parameter list}
是函数的逗号分隔参数的可选列表。松散地说,每个参数指定为
{type} {name}
参数的类型,后跟它的名称(再次笼统地说)。
"AvlTree" 不是类型。它是一个模板。要使其成为类型,您需要提供适当的模板参数。
void readFile(AvlTree<int> &t1, AvlTree<int> &t2)
现在您声明了一个带有两个参数的函数,每个参数都是对 AvlTree<int>
实例的引用,它是一种类型。 "AvlTree" 本身不是一种类型。这是模板的名称。
同样的问题导致了这里的所有其他编译错误。
ReadFile()
是否应该采用 AvlTree<int>
参数,或者 AvlTree<char>
参数,或者它本身应该是一个模板函数,这是你要弄清楚的事情。
我的导师为我们提供了一个定义 class AvlTree 的头文件,但由于某些原因我无法在 main() 中正常声明对象。我究竟做错了什么?这是头文件的相关部分:
#ifndef AVL_TREE_H
#define AVL_TREE_H
#include <iostream> // NULL, cin, cout
using namespace std;
template <typename Comparable>
class AvlTree
{
public:
AvlTree( ) : root( NULL )
{ }
AvlTree( const AvlTree & rhs ) : root( NULL )
{
*this = rhs;
}
private:
struct AvlNode
{
Comparable element;
AvlNode *left;
AvlNode *right;
int height;
AvlNode( const Comparable & theElement, AvlNode *lt,
AvlNode *rt, int h = 0 )
: element( theElement ), left( lt ), right( rt ), height( h ) { }
};
AvlNode *root;
};
#endif
这是我在 main 中尝试做的事情:
#include "AvlTree.h"
void readFile(AvlTree &t1, AvlTree &t2)
{
// do some stuff
return;
}
void splayAccess(AvlTree &t1, AvlTree &t2)
{
// do some stuff
return;
}
int main (void)
{
// object declarations
AvlTree tree1;
AvlTree tree2;
// function calls
readFile(tree1, tree2);
splayAccess(tree1, tree2);
return 0;
}
这里是错误(GNU 编译器):
cwd0042@cse04:~/3110/hw4$ g++ header.h mcve.cpp
mcve.cpp:3:15: error: variable or field ‘readFile’ declared void
mcve.cpp:3:23: error: missing template arguments before ‘&’ token
mcve.cpp:3:24: error: ‘t1’ was not declared in this scope
mcve.cpp:3:36: error: missing template arguments before ‘&’ token
mcve.cpp:3:37: error: ‘t2’ was not declared in this scope
mcve.cpp:9:18: error: variable or field ‘splayAccess’ declared void
mcve.cpp:9:26: error: missing template arguments before ‘&’ token
mcve.cpp:9:27: error: ‘t1’ was not declared in this scope
mcve.cpp:9:39: error: missing template arguments before ‘&’ token
mcve.cpp:9:40: error: ‘t2’ was not declared in this scope
mcve.cpp: In function ‘int main()’:
mcve.cpp:18:10: error: missing template arguments before ‘tree1’
mcve.cpp:18:10: error: expected ‘;’ before ‘tree1’
mcve.cpp:19:10: error: missing template arguments before ‘tree2’
mcve.cpp:19:10: error: expected ‘;’ before ‘tree2’
mcve.cpp:22:11: error: ‘tree1’ was not declared in this scope
mcve.cpp:22:18: error: ‘tree2’ was not declared in this scope
mcve.cpp:22:23: error: ‘readFile’ was not declared in this scope
mcve.cpp:23:26: error: ‘splayAccess’ was not declared in this scope
template <typename Comparable>
class AvlTree
// ...
这声明了一个名为 AvlTree
的模板 class。此模板采用一个参数。
void readFile(AvlTree &t1, AvlTree &t2)
声明函数的语法是:
{return type} function-name( {parameter list} )
{parameter list}
是函数的逗号分隔参数的可选列表。松散地说,每个参数指定为
{type} {name}
参数的类型,后跟它的名称(再次笼统地说)。
"AvlTree" 不是类型。它是一个模板。要使其成为类型,您需要提供适当的模板参数。
void readFile(AvlTree<int> &t1, AvlTree<int> &t2)
现在您声明了一个带有两个参数的函数,每个参数都是对 AvlTree<int>
实例的引用,它是一种类型。 "AvlTree" 本身不是一种类型。这是模板的名称。
同样的问题导致了这里的所有其他编译错误。
ReadFile()
是否应该采用 AvlTree<int>
参数,或者 AvlTree<char>
参数,或者它本身应该是一个模板函数,这是你要弄清楚的事情。