2016-06-22 10 views
0

私はエラーを取得する:未定義の参照 'のstd ::文字列ヘルパー:: ToStringメソッド<int>(int型のconst&)'

undefined reference to 'std::string Helper::ToString<int> (int const&)' in Helper.h on line ToString(y):

Helper.h

#ifndef HELPER_H 
#define HELPER_H 

#include <ctime> 
#include <string> 
#include <sstream> 
#include <fstream> 

namespace Helper 
{ 
    template <class T> 

    std::string ToString(const T &); 

    struct DateTime 
    { 
     DateTime() 
     { 
      time_t ms; 
      time (&ms); 

      struct tm *info = localtime(&ms); 

      D = info->tm_mday; 
      m = info->tm_mon + 1; 
      y = 1900 + info->tm_year; 
      M = info->tm_min; 
      H = info->tm_hour; 
      S = info->tm_sec; 
     } 

     DateTime(int D, int m, int y, int H, int M, int S) : D(D), m(m), y(y), H(H), M(M), S(S) {} 
     DateTime(int D, int m, int y) : D(D), m(m), y(y), H(0), M(0), S(0) {} 


    DateTime Now() const 
    { 
     return DateTime(); 
    } 

    int D, m, y, H, M, S; 


    std::string GetDateString() const 
    { 
     return std::string(D < 10 ? "0" : "") + ToString(D) + 
       std::string(m < 10 ? ".0" : ".") + ToString(m) + "." + 
       ToString(y); 

    } 

    std::string GetTimeString(const std::string &sep = ":") const 
    { 
     return std::string(H < 10 ? "0" : "") + ToString(H) + sep + 
       std::string(M < 10 ? "0" : "") + ToString(M) + sep + 
       std::string(S < 10 ? sep : "") + ToString(S); 
    } 

    std::string GetDateTimeString(const std::string &sep = ":") const 
    { 
     return GetDateString() + " " + GetTimeString(sep); 
    } 
    }; 
}; 
template <class T> 

std::string ToString(const T &e) 
{ 
    std::ostringstream s; 
s << e; 
return s.str(); 
} 

void WriteAppLog(const std::string &s) 
{ 
std::ofstream file ("AppLog.txt", std::ios::app); 
file << "[" << Helper::DateTime().GetDateTimeString() << "]" << 
"\n" << s << std::endl << "\n"; 
file.close(); 
} 


#endif // HELPER_H 

KeyConstant.h

#ifndef KEYCONSTANT_H 
#define KEYCONSTANT_H 

#include <map> 
#include <string> 

class KeyPair 
{ 
public: 
    KeyPair (const std::string &vk = "", const std::string &name = "") : VKName (vk), Name (name) {} 

std::string VKName; 
std::string Name; 
}; 

class Keys 
{ 
public: 
static std::map<int, KeyPair> KEYS; 

}; 
#endif // KEYCONSTANTS_H 

main.cpp

#include <iostream> 
#include <windows.h> 
#include "Helper.h" 
#include "KeyConstant.h" 
#include "Base64.h" 

using namespace std; 

int main() 
{ 
MSG Msg; 

while (GetMessage (&Msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return 0; 
} 
+1

字下げはあまり明確ではありませんが、 'Helper'の名前空間の範囲外で' Helper :: ToString'を定義しようとしているようです。つまり、 'Helper :: ToString'は宣言されていますが、定義されていません。 – ArchbishopOfBanterbury

答えて

1

バインド名前空間への実装:

template <class T> 
std::string Helper::ToString(const T &e) 
     // ^^^^^^^^ 
{ 
    std::ostringstream s; 
    s << e; 
    return s.str(); 
} 

またはインラインそれを置く:あなたは、名前空間Helper方法Helper::ToStringを宣言したが、どこにもそれを定義していない

namespace Helper 
{ 
    template <class T> 
    std::string ToString(const T &e) { 
     std::ostringstream s; 
     s << e; 
     return s.str(); 
    } 
    // ... 
} 
0

。名前空間外のHelper.hToStringメソッドの定義は、名前空間内の宣言については何も知らない。

他の答えが示唆するように実装をバインドするか、またはこのメソッドを宣言した名前空間Helperの内部に定義します。

0

は、ヘッダーファイルでは、「名前空間ヘルパー」の国境にこの部分に

template <class T> 

std::string ToString(const T &e) 
{ 
    std::ostringstream s; 
s << e; 
return s.str(); 
} 

void WriteAppLog(const std::string &s) 
{ 
std::ofstream file ("AppLog.txt", std::ios::app); 
file << "[" << Helper::DateTime().GetDateTimeString() << "]" << 
"\n" << s << std::endl << "\n"; 
file.close(); 
} 

を配置する必要があります。現在は外です。 また、 "namespace Helper"の末尾の中括弧の後にセミコラムを削除する必要があります。

関連する問題