2016-03-20 4 views
0

Я объявил следующий класс:неразрешенный внешний символ при использовании зЬй :: wstring

#pragma once 

#include <stdio.h> 
#include <vector> 
#include <string> 

namespace util 
{ 

class FileReader 
{ 
public: 
    FileReader(); 
    ~FileReader(); 

    bool open(const std::wstring& name); 
    void close(); 
    bool read(std::vector<char>& buf, __int64 startFrom, int size); 
    __int64 size() const; 

private: 
    FILE* m_file; 
    std::wstring m_name; 
    __int64 m_size; 
}; 

} 

И его реализация:

#include "FileReader.hpp" 

namespace util 
{ 

bool FileReader::open(const std::wstring& name) 
{ 
    if (!name.empty() && (m_name != name)) 
    { 
     close(); 
     if (_wfopen_s(&m_file, name.c_str(), L"rb") == 0) 
     { 
      m_name = name; 
      // Get the file size 
      _fseeki64(m_file, 0, SEEK_END); 
      m_size = _ftelli64(m_file); 
      rewind(m_file); 
     } 
     else 
     { 
      m_file = NULL; 
     } 
    } 
    return (m_file != NULL); 
} 
// .... 
} 

в отдельной библиотеке и использовать его как это:

FileTransfer.cpp

#include <util/FileReader.hpp> 

// .....  

if (!m_fileReader.open(m_localFileName)) // std::wstring m_localFileName; 
{ 
    ::MessageBoxA(NULL, "Failed to open file", "Error", MB_ICONERROR); 
    stopFileTransmission(); 
    return; 
} 

в другом проекте. Оба проекта успешно скомпилируется, но FileTransfer.obj не удается ссылка:

Ошибка 2 Ошибка LNK2019: неразрешенный внешний символ «общественности: BOOL __thiscall Util :: FileReader :: открытый (класс станд :: basic_string, класс std :: allocator> const &) « (? open @ FileReader @ util @@ QAE_NABV? $ basic_string @ GU? $ char_traits @ G @ std @@ V? $ allocator @ G @ 2 @@ std @@@ Z) упоминаться в функции __catch $ onRequestDirClicked @ FileTransferWindow @@ AAEXXZ $ 0 C: \ Users \ х \ Documents \ DEV \ Server \ FileTransfer.obj сервер

Я помню, что он работал, когда я использовал std::string, поэтому я предполагаю, что у него есть что-то с std::wstring.

Любая идея в чем проблема?

+0

Это не решит вашу проблему, но мой первый комментарий заключается в том, что вам следует избегать добавления директив 'include' в заголовки, если сами заголовки не используют символы. И даже тогда, предпочитают форвардную декларацию. – StoryTeller

+0

Я предполагаю, что реализация также находится в пространстве имен 'util'? – StoryTeller

+0

Да, реализация 'bool FileReader :: open' находится в пространстве имен' util' – user66875

ответ

0

Кажется, проблема заключалась в том, что эти два проекта были разные значения для параметра

Treat wchar_t, как встроенный тип

Установка в Нет (/ Zc: wchar_t-) для обоих проектов, решил ошибку компоновщика. Я все еще не знаю, каковы будут последствия.

+1

[MSDN] (https://msdn.microsoft.com/en-us/library/dh8che7s.aspx) рекомендует обратное – StoryTeller