2012-01-07 155 views
0

注意:我不認爲這是與其他十億個有關此問題的重複。我查看了有問題的代碼,這不是一個語法錯誤(我認爲)。」預計unqualified-id before'。'token「錯誤 - C++

我有以下功能:

char init_fundementals() 
{ 
    BinIO.AddBinType(typeid(uint16_t), read_uint16, write_uint16); 
    BinIO.AddBinType(typeid(char*), read_cstr, write_cstr); 
    BinIO.AddBinType(typeid(uint32_t), read_uint32, write_uint32); 
    return 'z'; 
} 

,所有的write_的...和... read_功能早些時候文件中聲明。該文件是一個標題(因爲我所做的就是包含它)。有一個原因總是返回z。這是一個黑客攻擊,我不確定是否有效。編譯器給我以下錯誤:

fundemental_bin_types.h:70:10: error: expected unqualified-id before ‘.’ token 
fundemental_bin_types.h:71:10: error: expected unqualified-id before ‘.’ token 
fundemental_bin_types.h:72:10: error: expected unqualified-id before ‘.’ token 

此標題包含類BinIO的標題。

BinIO.h:

#ifndef BINIO_H 
#define BINIO_H 
#include <fstream> 
#include <boost/shared_ptr.hpp> 
#include <map> 
#include <typeinfo> 
using namespace std; 
typedef boost::shared_ptr<fstream> fstream_ptr; 
class BinIO { 
public: 
    BinIO(); 
    static void AddBinType(type_info t_name, void(*reader)(fstream_ptr, void*), void(*writer)(fstream_ptr, void*)); 
protected: 
    static map<char*, void(*)(fstream_ptr, void*)> typemap_r; 
    static map<char*, void(*)(fstream_ptr, void*)> typemap_w; 
}; 
#endif /* BINIO_H */ 

BinIO.cpp:

#include "BinIO.h" 
BinIO::typemap_r=map<char*, void(*)(fstream_ptr, void*)>; 
BinIO::typemap_w=map<char*, void(*)(fstream_ptr, void*)>; 
BinIO::BinIO() { 
} 
BinIO::AddBinType(type_info t_name, void(*)(fstream_ptr,void*) reader, void(*)(fstream_ptr,void*) writer) 
{ 
    typemap_r.insert(pair<char*, void(*)(fstream_ptr, void*)>(t_name.name(), reader)); 
    typemap_w.insert(pair<char*, void(*)(fstream_ptr, void*)>(t_name.name(), writer)); 
} 

fundamental_bin_types.h:

#ifndef FUNDEMENTAL_BIN_TYPES_H 
#define FUNDEMENTAL_BIN_TYPES_H 
#include <cstring> 
#include <arpa/inet.h> 
#include "BinIO.h" 
using namespace std; 
void read_uint32(fstream_ptr in, void* out) 
{ 
    char data[sizeof(uint32_t)]; 
    (*in).read(data, 4); 
    *((uint32_t*)out)=ntohl(reinterpret_cast<uint32_t>(data)); 
} 
void write_uint32(fstream_ptr out, void* in) 
{ 
    (*out).write(reinterpret_cast<char*>(htonl(*(uint32_t*)in)), sizeof(uint32_t)); 
} 
// 
void read_cstr(fstream_ptr in, void* out) 
{ 
    char* buff; 
    char* size; 
    (*in).read(size, sizeof(size_t)); 
    (*in).read(buff, reinterpret_cast<size_t>(size)); 
    *((char*)out)=*buff; 
} 
void write_cstr(fstream_ptr out, void* in) 
{ 
    (*out).write(reinterpret_cast<char*>(in), sizeof(size_t)); 
    (*out).write((char*)in, strlen((char*)in)); 
} 
// 
void read_uint16(fstream_ptr in, void* out) 
{ 
    char data[sizeof(uint16_t)]; 
    (*in).read(data, sizeof(uint16_t)); 
    *((uint16_t*)out)=ntohs(*reinterpret_cast<uint16_t*>(data)); 
} 
void write_uint16(fstream_ptr out, void* in) 
{ 
    (*out).write(reinterpret_cast<char*>(htons(*((uint16_t*)in))), sizeof(uint16_t)); 
} 
// 
void read_bindata(fstream_ptr in, void* out) 
{ 
    uint32_t* size; 
    read_uint32(in, size); 
    out=new char[*size]; 
    (*in).read((char*)out, *size); 
} 
void write_bindata(fstream_ptr out, void* in) 
{ 
    char buff[4]; 
    for(int i=0; i<4; i++) 
    { 
     buff[i]=*(((char*)in)+i); 
    } 
    (*out).write(buff, 4); 
    (*out).write(((char*)in)+4, reinterpret_cast<uint32_t>(buff)); 
} 
void init_fundementals() 
{ 
    BinIO.AddBinType(typeid(uint16_t), read_uint16, write_uint16); 
    BinIO.AddBinType(typeid(char*), read_cstr, write_cstr); 
    BinIO.AddBinType(typeid(uint32_t), read_uint32, write_uint32); 
} 
#endif /* FUNDEMENTAL_BIN_TYPES_H */ 

是否有人知道問題是什麼?

回答

4

你必須使用::訪問靜態函數:

BinIO::AddBinType(typeid(uint16_t), read_uint16, write_uint16); 
+0

謝謝!!!!這很明顯。感謝您及時的回覆。 – Linuxios 2012-01-07 16:15:09

2

C++中範圍解析操作::,這就是你需要使用訪問靜態方法或成員,不像Java的東西或C#:

BinIO::AddBinType 

,而不是

BinIO.AddBinType 
相關問題