typedef'ing STL wstring - PullRequest
       10

typedef'ing STL wstring

2 голосов
/ 13 ноября 2009

Почему, когда я делаю следующее, я получаю ошибки, связанные с wchar_t?

namespace Foo
{
    typedef std::wstring String;
}

Теперь я объявляю все мои строки как Foo :: String во всей программе, но когда я пытаюсь создать новую строку Foo :: String из wchar_t *, я получаю сообщение об ошибке, например ::

namespace Bar
{
   static const wchar_t* COMMON_BAR = L"Hello";
}

int main()
{
    Foo::String A(Bar::COMMON_BAR);
};

Я получаю следующую ошибку от visual studio:

error C2440: '<function-style-cast>' : cannot convert from 'const wchar_t *' to 'Foo::String'

Что не так?

РЕДАКТИРОВАТЬ Извините, что говорю Bar :: COMMON_BAR: (

Также я работаю над Visual Studio 2008. Я очень расстроен этим.

РЕДАКТИРОВАТЬ # 2

Извините, я не смог ответить на это раньше. Проблемы оказались большей проблемой, чем я хотел. Теперь я заметил, сколько используя std :: wstring; Там в коде плавают.

Это абсолютное дно глобального заголовочного файла.

// WStrings are a waste
// Feb 2007
#define wstring string

Тьфу. Спасибо, извините, это пустая трата времени: (

Ответы [ 4 ]

1 голос
/ 13 ноября 2009

Следующий код скомпилирован и запущен под llvm-gcc:

#include <string>
namespace Foo
{
    typedef std::wstring String;
}

namespace Bar
{
   static const wchar_t* COMMON_BAR = L"Hello";
}

int main()
{
    Foo::String A(Bar::COMMON_BAR);
};

Обратите внимание, что вместо этого вы случайно установили COMMON_DATA_PATH. Я не уверен, какой компилятор вы используете, но llvm-gcc выдает следующую ошибку:

/tmp/webcompile/_1569_0.cc: In function 'int main()':
/tmp/webcompile/_1569_0.cc:14: error: 'COMMON_DATA_PATH' is not a member of 'Bar'
/tmp/webcompile/_1569_0.cc: At global scope:
/tmp/webcompile/_1569_0.cc:9: warning: 'Bar::COMMON_BAR' defined but not used

Попробуйте демо-версию здесь .

0 голосов
/ 13 ноября 2009

Код, который вы разместили, компилирует (с добавлением #include <string>) штраф для меня с 32-битным компилятором VS 2008: Версия 15.00.21022.08

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

Мой путь включения имеет следующий вид:

C:\Program Files\Microsoft Visual Studio 9.0\VC\ATLMFC\INCLUDE
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE
C:\Program Files\Microsoft SDKs\Windows\v6.0A\include
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\include\

Попытайтесь сделать свой эквивалент и посмотреть, улучшит ли это вещи (на самом деле, необходима только вторая строка). Если так, то вы на пути к тому, чтобы что-то добавить обратно, пока оно снова не сломается, чтобы найти виновника.

Еще одна вещь, которая может помочь - внутри IDE, наведите курсор на символ wstring правой кнопкой мыши и выберите «Перейти к объявлению». Среда IDE должна открыть заголовочный файл c:\Program Files\Microsoft Visual Studio 9.0\VC\include\xstring в объявлении, которое выглядит примерно так:

typedef basic_string<wchar_t, char_traits<wchar_t>,
allocator<wchar_t> > wstring;

Если он приземлится где-то еще, это, вероятно, ваша проблема.

Вы можете сделать то же самое с символом String в main(), и среда IDE должна перейти к вашему typedef.

0 голосов
/ 13 ноября 2009

Почему у вас COMMON_DATA_PATH в конструкторе и COMMON_BAR в Foo? Это ошибочный тип?

0 голосов
/ 13 ноября 2009

Он прекрасно компилируется для меня с изменениями: Foo :: String A (Bar :: COMMON_BAR);

Что такое COMMON_DATA_PATH?

...