c ++错误:无法转换&#39; const std :: basic_string <char>&#39;到&#39; int&#39;在任务中

时间:2016-05-15 08:02:32

标签: c++ string templates

我该如何解决?在main函数中,当我尝试使新节点具有字符串数据时,它不能。错误信息是[错误]无法转换&#39; const std :: basic_string&#39;到&#39; int&#39;在任务中。我该怎么做??

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;
}

2 个答案:

答案 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>仅会处理intstring,但您可以添加更多模板参数来处理更多类型,例如boost::variant<int, string, double>

如果您有兴趣了解如何处理这个难题,请查看Volker Simonis和Roland Weiss撰写的这篇精彩的开创性文章:http://www.progdoc.de/papers/nseq/nseq/nseq.html