无法将argument1转换为const char

时间:2015-06-09 18:55:56

标签: c++ pointers c++11

我有这段代码:

#include <iostream> 
#include <string>

using namespace std;

typedef unsigned char byte;
byte text[] = "test";

int text_len;

struct Huf {
    byte id;
    int wh;
    Huf *left, *right;
};

struct List {
    List *next;
    Huf *tree;
};

List *head;
char code[256];

void createList();
void writeList();
void delList(List *);
void addList(Huf *);
Huf *findDels();
void createTree();
void rlrootTree(Huf *, unsigned);

int main()
{
    text_len = strlen(text);
    createList();
    writeList();
    createTree();
    cout << "writeCodes\n";
    rlrootTree(head->tree, 0);
    cout << endl;
    return 0;
}

void createList()
{
    int i;
    int ch[256] = { 0 };
    for (i = 0; i<text_len; i++) ch[text[i]]++;
    List *l;
    Huf *h;
    head = 0;
    for (i = 0; i<255; i++) if (ch[i]>0)
    {
        h = new Huf;
        h->id = i; h->wh = ch[i];
        h->left = 0; h->right = 0;
        l = new List;
        l->tree = h;
        l->next = head; head = l;
    }
}

void writeList()
{
    cout << "writeList\n";
    List *l = head;
    while (l)
    {
        cout << (l->tree)->id << " ";
        l = l->next;
    }
    cout << endl;
    l = head;
    while (l)
    {
        cout << (l->tree)->wh << " ";
        l = l->next;
    }
    cout << endl;
}

void delList(List *l)
{
    List *lp, *lc;
    if (l == head) { head = l->next; delete l; }
    else
    {
        lp = head; lc = lp->next;
        while (lc != l) { lp = lc; lc = lc->next; }
        lp->next = lc->next; delete lc;
    }
}

void addList(Huf *h)
{
    List *l = new List;
    l->tree = h;
    l->next = head;
    head = l;
}

Huf *findDels()
{
    List *l = head, *sm = head;
    Huf *h;
    while (l)
    {
        if ((l->tree)->wh < (sm->tree)->wh) sm = l;
        l = l->next;
    }
    h = sm->tree;
    delList(sm);
    return h;
}

void createTree()
{
    Huf *h, *h1, *h2;
    while (head->next)
    {
        h1 = findDels();
        h2 = findDels();
        h = new Huf;
        h->id = ' '; h->wh = h1->wh + h2->wh;
        h->left = h1; h->right = h2;
        addList(h);
    }
}

void rlrootTree(Huf *h, unsigned index)
{
    if (h)
    {
        code[index] = '0';
        rlrootTree(h->right, index + 1);
        if (h->left == 0)
        {
            code[index] = '\0';
            cout << h->id << "->" << code << " ";
        }
        code[index] = '1';
        rlrootTree(h->left, index + 1);
    }
}

但我收到此错误消息:

Error   1   error C2664: 'size_t strlen(const char *)' : cannot convert argument 1 from 'byte [5]' to 'const char *'    c:\users\user\documents\visual studio 2013\projects\test11\test11\source.cpp    35  1   test11
2   IntelliSense: argument of type "byte *" is incompatible with parameter of type "const char *"   c:\Users\user\Documents\Visual Studio 2013\Projects\test11\test11\Source.cpp    35  20  test11

......我不知道为什么?

2 个答案:

答案 0 :(得分:0)

解决方案1:将您的字节数组转换为char*

text_len = strlen(reinterpret_cast<char*>(text));

解决方案2:如果您可以按如下方式更改typedef,则无需强制转换即可使用

typedef  char byte;  // the compiler then can implicitely convert byte* to char*

问题是unsigned:如果你的C ++实现将char处理为signed(是的,这是依赖于实现的!),编译器就不知道你想如何从unsigned转换(例如char 253) )签署的等价物。

答案 1 :(得分:0)

typedef unsigned char byte;
byte text[] = "test";
...

strlen(text);

最终变成

unsigned char text[] = "test";

属于const unsigned char *类型,strlen不接受该类型。

size_t strlen ( const char * str );

您可以将text数组定义为signed char的数组,或简单地char,也可以在使用strlen时将其强制转换为strlen((const char*)text); // or reinterpret_cast<const char*>(text); >

Net_SMTP2