2016-05-30 2 views
0

現在、私のすべての関数が正しく動作する固有のソースファイル(* .cpp)があります。今、私はそれらのいくつかを別々のソースファイルに取り込み、それらを主なソースに含めて成功を収めようとしています。最初の機能についてC++は別々のソースファイルに関数を入れます

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <windows.h> 
#define _SQLNCLI_ODBC_ 
#include <sqlext.h> 
#include <sqlncli.h> 

using namespace std; 
using std::cout; 
using std::ifstream; 


/*This is one of the functions to be put in separate file:*/ 
string *ReadPageAsignations (const char* RutayNombre, const char* Page) 
{ 
bool MisionCumplida = false; 
bool EncabezadoListo = false; 
int i = 0; 
int j = 0; 
char * pch; 
char istr[256]; 
const int NUM_DATA = 15;  
static string data[NUM_DATA]; 
std::stringstream InputString; 
ifstream inputFile(RutayNombre); 

if (inputFile.is_open())   
    { 
    while (inputFile.good() && MisionCumplida == false) 
    { 
     i = 0; 
     inputFile.getline(istr,256); 
     pch = strtok (istr,":"); 
     if (string(pch) == "[Pagina]") 
     { 
      EncabezadoListo = true; 
     } 
     else 
     { 
      EncabezadoListo = false; 
     } 
     if (string(pch) == Page) 
     { 
      MisionCumplida = true; 
     } 
     while (pch != NULL) 
      { 
       if ((EncabezadoListo == true) || (MisionCumplida == true)) 
       { 
        data[i] = data[i] + " " + string(pch); 
       } 
       pch = strtok (NULL, ","); 
       i++; 
      } 
    } 
    inputFile.close(); 
    return data; 
    } 
} //End of function 'ReadPageAsignations' 

/*This is another function where my function "ReadPageAsignations' get called -- btw, I want also this function to be in a separate source file.*/ 
void DeliverHtml (const char* page){//const char* RutayNombre) { 
    string *p; 
    char * pch; 
    size_t pos; 
    string RutayNombre; 
RutayNombre = "../Substructure/Templates/" + SearchConfigValue("../Substructure/Conf/Config-Templates.txt", "htmlTemplate:"); 
const char *RutayNombreConfigCompos = "../Substructure/Conf/Config-Composition.txt"; 
    string RutayNombreParaInsertar; 
    string token, token1, token2; 
    string line, lineRead, lineToInsert; 
    char * StrToTokenize2; 
    string StrToTokenize1; 
p=ReadPageAsignations(RutayNombreConfigCompos, page); //Here, I call the function I want in a separate file 
... 
} 

/*And here is the main() function*/ 
int main() 
{ 
char *value = "page=Home"; 
    if (NULL!=strstr(getenv("QUERY_STRING"), "page=")) 
    { 
     value = getenv("QUERY_STRING"); 
    } 


    char *posCh = strstr(value, "="); 

    DeliverHtml(&posCh[0]+1); 
return 0; 
} 

、Iは、ヘッダファイル「ReadPageAsignations.h」とソースファイル「ReadPageAsignations.cpp」を作成しようとしている次のよう

私の現在のプロジェクトです。

ヘッダファイル 'ReadPageAsignations.h' を含む:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 


using namespace std; 
using std::cout; 
using std::ifstream; 

string *ReadPageAsignations (const char* RutayNombre, const char* Page) 
{ 
bool MisionCumplida = false; 
bool EncabezadoListo = false; 
int i = 0; 
int j = 0; 
char * pch; 
char istr[256]; 
const int NUM_DATA = 15; /*El numero de elementos debe coincidir con el iterador en la función Deliverhtml.*/ 
static string data[NUM_DATA]; 
std::stringstream InputString; 
ifstream inputFile(RutayNombre); //Abre el archivo y lo asigna al stream inputFile. 

if (inputFile.is_open())  //Chequea que el archivo esté abierto. 
    { 
    while (inputFile.good() && MisionCumplida == false) 
    { 
     i = 0; 
     inputFile.getline(istr,256); 
     pch = strtok (istr,":"); 
     if (string(pch) == "[Pagina]") 
     { 
      EncabezadoListo = true; 
     } 
     else 
     { 
      EncabezadoListo = false; 
     } 
     if (string(pch) == Page) 
     { 
      MisionCumplida = true; 
     } 
     while (pch != NULL) 
      { 
       if ((EncabezadoListo == true) || (MisionCumplida == true)) 
       { 
        data[i] = data[i] + " " + string(pch); 
       } 
       pch = strtok (NULL, ","); 
       i++; 
      } 
    } 
    inputFile.close(); 
    return data; 
    } 
} //End function 

と、含むメインプロジェクト:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <windows.h> 
#define _SQLNCLI_ODBC_ 
#include <sqlext.h> 
#include <sqlncli.h> 

#include "ReadPageAsignations.h" //Here I #include the function definition file (header) 

using namespace std; 
using std::cout; 
using std::ifstream; 
... 
} 
を含む別の機能のための

#ifndef READPAGEASIGNATIONS_H_INCLUDED 
#define READPAGEASIGNATIONS_H_INCLUDED 

string *ReadPageAsignations (const char* RutayNombre, const char* Page); 

#endif // READPAGEASSIGNATIONS_H_INCLUDED 

ソースファイル 'ReadPageAsignations.cpp' を

私は多くのコンパイルエラーがあります:

\ReadPageAsignations.h|4|error C2143: syntax error : missing ';' before '*'| 
\ReadPageAsignations.h|4|error C4430: missing type specifier - int assumed. Note: C++ does not support default-int| 
\ReadPageAsignations.h|4|error C4430: missing type specifier - int assumed. Note: C++ does not support default-int| 
main.cpp|20|error C2872: 'string' : ambiguous symbol| 
... 

私はVisual C++ 2005/2008コンパイラでCode :: blocks 13.12を使用しています。

ご協力いただきありがとうございます。

+2

'' を含める必要があり、ソースファイルは、私はあなたが開始することをお勧めヘッダ – user463035818

+0

が含まれている必要がありReadPageAsignations.hあなたのヘッダーより小さな例があります。より少ないコードを使用してそれを正しくしようとすると、実際のプロジェクトでそれを行う方法もわかります – user463035818

答えて

0

あなたのヘッダファイルに#include <string>を入れて、次のようにあなたの.cppファイル

からそれを削除する必要があります。

main.cppに

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <windows.h> 
#define _SQLNCLI_ODBC_ 
#include <sqlext.h> 
#include <sqlncli.h> 
#include "ReadPageAsignations.h" 
... 

注:同じ名前のヘッダファイルを含みます.cppファイルのうち、両方を含みます。

ReadPageAsignations.h

#ifndef READPAGEASIGNATIONS_H_INCLUDED 
#define READPAGEASIGNATIONS_H_INCLUDED 
#include <string>  //<-----This line, include string header 

std::string *ReadPageAsignations (const char* RutayNombre, const char* Page); 

#endif // READPAGEASSIGNATIONS_H_INCLUDED 

ReadPageAsignations.cpp

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include "ReadPageAsignations.h" // <--- add the header file here 
//#include <string> <---remove it already included in the header file 


using namespace std; 
//using std::cout; <--remove this you already used namespace std 
//using std::ifstream; <--remove this you already used namespace std 

string *ReadPageAsignations (const char* RutayNombre, const char* Page) 
{ 

... } //End function 
1

エラーは、ヘッダファイルを解析しようとしたときにシンボルstringが発生し、それを認識しないことを示しています。 #include <string>をヘッダーファイルに追加し、stringタイプを完全修飾すると、std::stringになります。

+1

imhoはヘッダー内のすべてを含めて最高です。代わりにヘッダーに必要なものすべてをヘッダーに含めることになります。 – user463035818

+0

十分です。コンパイル時にはそれが確実に削減されます。私は私の答えを変えます。 – Exide