我该如何解决?在main函数中,当我尝试使新节点具有字符串数据时,它不能。错误信息是[错误]无法转换' const std :: basic_string'到' int'在任务中。我该怎么做??
template <typename value_type>
class node : public element
public :
value_type data;
node();
node (const value_type& T);
~node();
};
template <typename value_type>
node<value_type> :: node(const value_type& T)
{
type = 0;
intd= 0;
stringd = "";
if(typeid(T)==typeid(int))
{
type= 0;intd = T;
}
else if(typeid(T)==typeid(string))
{
type = 3;stringd = T;
}
this->left = NULL;
this->right = NULL;
this->data = T;
}
int main()
{
string s1 = "123";
node *n1 = new node<string>(s1);
return 0;
}
答案 0 :(得分:0)
问题在于这一行:
if(typeid(T)==typeid(int))
{
type= 0;intd = T; // *** here ***
}
虽然您在将typeid(T)==typeid(int)
分配给T
变量之前动态检查int
,但C ++是静态类型。分配不会编译,因为您无法将string
分配给int
变量。
相反,您可以使用模板专业化:
#include <string>
#include <typeinfo>
using std::string;
struct element{
int type, intd;
string stringd;
void *left, *right;
};
template <typename value_type>
class node : public element{
public :
value_type data;
node();
node (const value_type& T);
~node();
};
template <typename value_type>
node<value_type> :: node(const value_type& T)
{
type = 0;
intd= 0;
stringd = "";
this->left = NULL;
this->right = NULL;
this->data = T;
}
template <>
node<int> :: node(const int& T)
{
type= 0;
intd = T;
stringd = "";
this->left = NULL;
this->right = NULL;
this->data = T;
}
template <>
node<string> :: node(const string& T)
{
type = 3;
intd= 0;
stringd = T;
this->left = NULL;
this->right = NULL;
this->data = T;
}
// defining destructor is required to use delete
template <typename value_type>
node<value_type> :: ~node()
{
}
int main()
{
string s1 = "123";
node<string> *n1 = new node<string>(s1);
delete n1;
return 0;
}
我也是
{
之后添加class node : public element
。n1
的类型从node
更改为node<string>
以避免编译错误。答案 1 :(得分:0)
您最终希望将Node对象放入某种容器中,如链接列表。容器不处理不同类型的元素。您可以在容器中存储void *指针以隐藏其内部详细信息。但是你放弃了编译器类型检查。
获取类型检查的一种方法是隐藏在类似boost :: variant中保存多个类型的机制。您的Node
对象不需要模板化,因为您将data
声明为:
boost::variant<int, string> data;
boost::variant<int, string>
仅会处理int
和string
,但您可以添加更多模板参数来处理更多类型,例如boost::variant<int, string, double>
。
如果您有兴趣了解如何处理这个难题,请查看Volker Simonis和Roland Weiss撰写的这篇精彩的开创性文章:http://www.progdoc.de/papers/nseq/nseq/nseq.html