Почему g ++ помечает ошибку приведения в невыполненный код? - PullRequest
0 голосов
/ 28 октября 2018

main:

#include "multiparse.h"

int main()

{
    parse_string obj;
    obj = "1234";
    //int a = obj;
    //obj = 1234;
    return 0;
}

заголовок:

class parse_string
{
char* str;
long str_sz;
double val;
bool isnumber;
public:
template<class typename>
    parse_string& operator=(typenamet input)
    {
        //printf("%d == %d\n",typeid(input).name(),typeid(const char*).name());
        if(typeid(input)==typeid(char*)||typeid(input)==typeid(const char*))
        {
            str_sz=strlen(input)+1;
            if(str==0)
            {
                str = (char*)malloc(sizeof(char)*str_sz);
            }
            else
            {
                str = (char*)realloc(str,sizeof(char)*str_sz);
            }
            memset(str,0,str_sz);
            strcpy(str,input);
            this->str_to_num();
            isnumber=0;
            printf("A\n");
        }
        else
        {
            printf("B\n");
            val = (double)input;
            this->num_to_str();
            isnumber=1;
        }
    }
};

g ++ ошибка: multiparse.h ошибка: недопустимое приведение типа 'const char *' к типу 'double' в -> 'val = (double) input;'

Этот код не выполняется в моем случае, он просто напечатает "A", а не "B", но g ++ не компилирует этот код.Я не могу понять это.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Я нашел решение для своих требований, но думаю, что это не лучший способ:

parse_string& operator=(char* input)
    {
            str_sz=strlen(input)+1;
            if(str==0)
            {
                str = (char*)malloc(sizeof(char)*str_sz);
            }
            else
            {
                str = (char*)realloc(str,sizeof(char)*str_sz);
            }
            memset(str,0,str_sz);
            strcpy(str,input);
            this->str_to_num();
            isnumber=0;
            return *this;
    }

    parse_string& operator=(const char* input)
    {
            str_sz=strlen(input)+1;
            if(str==0)
            {
                str = (char*)malloc(sizeof(char)*str_sz);
            }
            else
            {
                str = (char*)realloc(str,sizeof(char)*str_sz);
            }
            memset(str,0,str_sz);
            strcpy(str,input);
            this->str_to_num();
            isnumber=0;
            return *this;
    }

    parse_string& operator=(char input)
    {
            val = (double)input;
            this->num_to_str();
            isnumber=1;
            return *this;
    }
    parse_string& operator=(int input)
    {
            val = (double)input;
            this->num_to_str();
            isnumber=1;
            return *this;
    }
    parse_string& operator=(long input)
    {
            val = (double)input;
            this->num_to_str();
            isnumber=1;
            return *this;
    }
    parse_string& operator=(unsigned char input)
    {
            val = (double)input;
            this->num_to_str();
            isnumber=1;
            return *this;
    }
    parse_string& operator=(unsigned int input)
    {
            val = (double)input;
            this->num_to_str();
            isnumber=1;
            return *this;
    }
    parse_string& operator=(unsigned long input)
    {
            val = (double)input;
            this->num_to_str();
            isnumber=1;
            return *this;
    }
    parse_string& operator=(double input)
    {
            val = input;
            this->num_to_str();
            isnumber=1;
            return *this;
    }
0 голосов
/ 28 октября 2018

Несмотря на то, что код не выполняется, он все еще является частью файла *.cpp (как это было #include d. Таким образом, он становится частью файла *.obj / *.o для этого источника.чтобы это произошло, компилятору нужно сгенерировать machine code для всего в файле *.cpp (шаблоны работают немного по-другому, но сейчас дело не в них).

Другими словами, чтобы получить .exe/ .lib / .dll файл, который состоит из .obj файлов, вам нужно, чтобы файлы, которые должны были стать .obj файлами, были правильно скомпилированы (перекодированы в machine code).

...