2014-09-26 65 views
0

我收到此錯誤消息,但我似乎無法理解它。 ANSI C++禁止在賦值中隱式轉換`void *'是什麼意思? 。和叉功能只函數名和若干錯誤:ANSI C++禁止在作業中從`void *'進行隱式轉換

螺紋::叉(VoidFunctionPtr FUNC,INT ARG)

錯誤消息:

../threads/threadtest.cc: In function `void ServerThread(int)': 
../threads/threadtest.cc:72: ANSI C++ forbids implicit conversion from `void *' in assignment 
../threads/threadtest.cc:78: implicit declaration of function `int WorkerThread(...)' 

REGION:

72 - 78 :

nextReq = list -> Remove(); 


    //check till the end                  
    while (nextReq != NULL) 
    { 
     WorkerThread(&nextReq); 

代碼:

#include "copyright.h" 
#include "system.h" 
#include <stdio.h> 
#include "request.h" 

extern void serve(char *url); 
//GLOBAL VARIABLE LIST 
List *list; 

//---------------------------------------------------------------------- 
// ThreadTest 
// read file and serve urls 
//---------------------------------------------------------------------- 

void 
ClientThread(int request) 
{ 
    const int sz = 50; 
    char url[sz]; 

    FILE *fp = fopen("url.txt", "r"); 
    if (!fp) 
    printf(" Cannot open file url.txt!\n"); 
    else { 
    int pos = 0; 
    char c = getc(fp); 
    while (c != EOF || pos == sz - 1) { 
     if (c == '\n') { 
    url[pos] = '\0'; 
    serve(url); 
    pos = 0; 

    //Store necessary information in a Request object for each request. 
    Request req(url, request, 1); 

    Request *reqq = &req; //req points to the object 
    list->Append(reqq); 
     } 
     else { 
    url[pos++] = c; 
     } 
     c = getc(fp); 
    } 
    fclose(fp); 
    } 
} 

//---------------------------------------------------------------------- 

void 
ServerThread(int which) 
{ 

    Request *nextReq; 
    //gets the first node off the list 
    nextReq = list -> Remove(); 


    //check till the end 
    while (nextReq != NULL) 
    { 
     WorkerThread(nextReq); 

    } 


} 

//---------------------------------------------------------------------- 

void 
WorkerThread (Request req) 
{ 
    serve(req.url); 
    currentThread -> Yield(); 
} 

//---------------------------------------------------------------------- 

void 
ThreadTest() 
{ 
    DEBUG('t', "Entering SimpleTest"); 
    printf("THREAD TEST"); 

    //Thread *c = new Thread("client thread"); 
    Thread *s = new Thread("server thread"); 

    s->Fork(ServerThread, 1); 
    ClientThread(0); 

} 
+2

當然,這不是您可以管理的最好的[MCVE](http://stackoverflow.com/help/mcve)。 – chris 2014-09-26 03:13:29

回答

2

這似乎是有問題的線路之一:

nextReq = list -> Remove(); 

似乎list->Remove()返回void *。 C++ 需要轉換成另一個指針(C不)。因此,將其更改爲:(。另外,考慮做List一個模板類,這樣可以儘量避免這類不安全類型轉換的基於您的代碼中,STL類std::queue<Request>應履行在這裏你的需求)

nextReq = static_cast<Request *>(list -> Remove()); 

第二條違規行是您在定義之前致電WorkerThread()。您需要在定義ServerThread()之前爲該功能添加原型。否則,編譯器不知道它的原型是什麼,一旦它達到ServerThread()的真實定義,它就應該抱怨它不符合它之前推導的原型。

void WorkerThread(Request); 

void 
ServerThread(int which) 
{ 
    // ... 

(或者,因爲WorkerThread()不叫ServerThread(),你可以只交換的兩個函數的定義的順序來解決這個問題。)


而且,請注意,這個代碼不好:

Request req(url, request, 1); 

Request *reqq = &req; //req points to the object 
list->Append(reqq); 

您構造一個對象,然後將一個指向堆棧分配對象的指針拖到列表中。當ClientThread()返回時,該對象將被銷燬,並且剩下一個指向不再存在的對象的指針。使用這個指針會觸發未定義的行爲。請考慮使用Request *reqq = new Request(url, request, 1);(但不要忘記在處理該對象後使用delete)在堆上分配新的Request

或者,更好的是,使用std::queue<Request>正如我之前建議的 - 那麼你可以只是queue.emplace(url, request, 1);。但請注意,您確實需要一種方法來同步從多個線程對隊列的訪問。

+0

在函數'無效ServerThread(INT):我得到這個錯誤: 從'請求**'轉換爲非標量類型'請求'請求。的WorkerThread(&nextReq); – 2014-09-26 03:36:27

+2

@monkeydoodle您需要執行'WorkerThread(* nextReq);'而不是。 'WorkerThread()'接受一個'Request',而不是任何一種指針。 – cdhowie 2014-09-26 03:37:25