STD wstring中的typedef

时间:2009-11-13 04:07:58

标签: c++ typedef

为什么我在执行以下操作时遇到与wchar_t相关的错误?

namespace Foo
{
    typedef std::wstring String;
}

现在我通过程序将所有字符串声明为Foo :: String,但是当我尝试从wchar_t *创建一个新的Foo :: String时,我得到一个错误,例如:

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 个答案:

答案 0 :(得分:1)

以下代码在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

试用现场演示here

答案 1 :(得分:0)

随着变化,它编译好我:     Foo :: String A(Bar :: COMMON_BAR);

什么是COMMON_DATA_PATH?

答案 2 :(得分:0)

为什么你在构造函数中有COMMON_DATA_PATH而在Foo中有COMMON_BAR?这是错误的吗?

答案 3 :(得分:0)

你发布的代码编译(加上#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