请问大神们,如何指定全局采用MFC的CSting,而仅在命名空间tc内使用tc:CString?

redleafe 2019-08-16 08:37:08
请问大神们,如何指定全局采用MFC的CSting,而仅在命名空间tc内使用tc:CString?

CString是MFC或者ATL中的实现,是MFC里面封装的一个关于字符串处理的功能很强大的类,只有支持MFC的工程才能使用。再别的工程就不能用CString了,只能使用标准C++中的string类了。在MFC中使用不需要自己加,但在另外的程序中需要加入#include<CString>。

我项目需要使用一个SDK,这个SDK自己的命名空间为tc,但其中又定义了CString。
我在我的项目中的stdafx.h加入:
#include "tc/tc.h"
using namespace tc;
SDK的tc.h文件定义了命名空间tc,及内部的CString类。
编译时,提示1>D:\VS2019\VC\Tools\MSVC\14.22.27905\atlmfc\include\afxwin.h(3214,1): error C2872: “CString”: 不明确的符号
编译器不知道afxwin.h中的函数EnlargeBufferGetText中的CSting的命名空间。

在stdafx.h加入:#include<CString>,问题依旧,编译器说不明确的符号。

我尝试采用using tc::CString; //声明其后出现的CString是属于命名空间tc中的CString
编译器报错:1>D:\VS2019\VC\Tools\MSVC\14.22.27905\atlmfc\include\afxwin.h(3244,1): error C2664: “TReturnType CWnd::EnlargeBufferGetText<TReturnType,int>(TReturnType,LPTSTR &,TCchType &,TCchType,TCchType,UINT,WPARAM &,LPARAM &,tc::CString &) const”: 无法将参数 9 从“CString”转换为“tc::CString &”
说明tc命名空间的CString并不能完全代替MFC的CString类。

应该是命名空间tc污染了全局命名空间,
所以现在需要在命名空间tc外,禁用tc:CString, 全局采用MFC的CSting,
仅在命名空间tc内使用tc:CString。

请问大神们有啥高招? 请指点,紧急求助,非常感谢。
...全文
2577 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
redleafe 2019-09-06
  • 打赏
  • 举报
回复
引用 68 楼 饺子与阿不 的回复:
我把cstring基本从mfc里掏出来了,你可以看看我的下载资源,xskin界面库中的相关代码,不必包含afxwin. h

谢谢
我试试
阿源是少年 2019-09-02
  • 打赏
  • 举报
回复
我把cstring基本从mfc里掏出来了,你可以看看我的下载资源,xskin界面库中的相关代码,不必包含afxwin. h
redleafe 2019-09-02
  • 打赏
  • 举报
回复
目前还没有找到解决方案,我先结帖了,等有了解决方案,再贴出来和大家共享。
redleafe 2019-08-24
  • 打赏
  • 举报
回复
引用 65 楼 tiger波波 的回复:
[quote=引用 64 楼 tiger波波 的回复:]
[quote=引用 63 楼 redleafe 的回复:]
[quote=引用 60 楼 tiger波波 的回复:]
[quote=引用 58 楼 redleafe 的回复:]
[quote=引用 55 楼 tiger波波 的回复:]
最简单的方式是不要加using namespace tc;
改为tc::Cstring和CString

在VS2019 MFC下测试了,不使用using namespace tc,只包含头文件就编译报错,说系统的头文件中的CString类型不明确,还没有对tc命名空间里的CString进行任何操作。
[/quote]

头文件里的内容是啥?看看能不能修改下[/quote]
尝试了修改SDK的头文件,重命名CString为tcCString,编译时链接出错,应该是lib文件的限制。
SDK目前是没办法处理。
[/quote]

把atlstr.h从你的vc安装目录拷出来,改个名字,加上域,放到你的工程目录下,然后批量替换工程里的CString,改为abc::Cstring[/quote]


这样吧,我试了下可以

MY_CString.h


#pragma once

#include <cstringt.h>

namespace ABCD
{
template< typename _BaseType = char, class StringIterator = ChTraitsOS< _BaseType > >
class StrTraitATL :
public StringIterator
{
public:
static HINSTANCE FindStringResourceInstance(_In_ UINT nID) throw()
{
return(AtlFindStringResourceInstance(nID));
}

static IAtlStringMgr* GetDefaultManager() throw()
{
return CAtlStringMgr::GetInstance();
}
};

typedef CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;
typedef CAtlString MYCString;
};




#include "MY_CString.h"

void Cdlg03Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
ABCD::MYCString str;
}


批量替换工程里的CString,改为ABCD::MYCString
[/quote]
非常感谢,这个方法我试过,不行,主要问题是SDK里面定义的CString到处引用,改了CString会导致lib库编译链接报错。
已经联系了SDK的技术支持,看看有没有好的方案,解决了的话就和大家一起分享并结贴,谢谢。
tiger波波 2019-08-23
  • 打赏
  • 举报
回复
引用 64 楼 tiger波波 的回复:
[quote=引用 63 楼 redleafe 的回复:] [quote=引用 60 楼 tiger波波 的回复:] [quote=引用 58 楼 redleafe 的回复:] [quote=引用 55 楼 tiger波波 的回复:] 最简单的方式是不要加using namespace tc; 改为tc::Cstring和CString
在VS2019 MFC下测试了,不使用using namespace tc,只包含头文件就编译报错,说系统的头文件中的CString类型不明确,还没有对tc命名空间里的CString进行任何操作。 [/quote] 头文件里的内容是啥?看看能不能修改下[/quote] 尝试了修改SDK的头文件,重命名CString为tcCString,编译时链接出错,应该是lib文件的限制。 SDK目前是没办法处理。 [/quote] 把atlstr.h从你的vc安装目录拷出来,改个名字,加上域,放到你的工程目录下,然后批量替换工程里的CString,改为abc::Cstring[/quote] 这样吧,我试了下可以 MY_CString.h

#pragma once

#include <cstringt.h>

namespace ABCD
{
	template< typename _BaseType = char, class StringIterator = ChTraitsOS< _BaseType > >
	class StrTraitATL :
		public StringIterator
	{
	public:
		static HINSTANCE FindStringResourceInstance(_In_ UINT nID) throw()
		{
			return(AtlFindStringResourceInstance(nID));
		}

		static IAtlStringMgr* GetDefaultManager() throw()
		{
			return CAtlStringMgr::GetInstance();
		}
	};

	typedef CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;
	typedef CAtlString MYCString;
};


#include "MY_CString.h"

void Cdlg03Dlg::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here
	ABCD::MYCString str;
}

批量替换工程里的CString,改为ABCD::MYCString
tiger波波 2019-08-23
  • 打赏
  • 举报
回复
引用 63 楼 redleafe 的回复:
[quote=引用 60 楼 tiger波波 的回复:] [quote=引用 58 楼 redleafe 的回复:] [quote=引用 55 楼 tiger波波 的回复:] 最简单的方式是不要加using namespace tc; 改为tc::Cstring和CString
在VS2019 MFC下测试了,不使用using namespace tc,只包含头文件就编译报错,说系统的头文件中的CString类型不明确,还没有对tc命名空间里的CString进行任何操作。 [/quote] 头文件里的内容是啥?看看能不能修改下[/quote] 尝试了修改SDK的头文件,重命名CString为tcCString,编译时链接出错,应该是lib文件的限制。 SDK目前是没办法处理。 [/quote] 把atlstr.h从你的vc安装目录拷出来,改个名字,加上域,放到你的工程目录下,然后批量替换工程里的CString,改为abc::Cstring
tiger波波 2019-08-22
  • 打赏
  • 举报
回复
引用 58 楼 redleafe 的回复:
[quote=引用 55 楼 tiger波波 的回复:] 最简单的方式是不要加using namespace tc; 改为tc::Cstring和CString
在VS2019 MFC下测试了,不使用using namespace tc,只包含头文件就编译报错,说系统的头文件中的CString类型不明确,还没有对tc命名空间里的CString进行任何操作。 [/quote] 头文件里的内容是啥?看看能不能修改下
redleafe 2019-08-22
  • 打赏
  • 举报
回复
引用 60 楼 tiger波波 的回复:
[quote=引用 58 楼 redleafe 的回复:]
[quote=引用 55 楼 tiger波波 的回复:]
最简单的方式是不要加using namespace tc;
改为tc::Cstring和CString

在VS2019 MFC下测试了,不使用using namespace tc,只包含头文件就编译报错,说系统的头文件中的CString类型不明确,还没有对tc命名空间里的CString进行任何操作。
[/quote]

头文件里的内容是啥?看看能不能修改下[/quote]
尝试了修改SDK的头文件,重命名CString为tcCString,编译时链接出错,应该是lib文件的限制。
SDK目前是没办法处理。
redleafe 2019-08-22
  • 打赏
  • 举报
回复
引用 61 楼 相门三少 的回复:
目前看,用了using namespace tc之后,调用MFC的CString时,会从tc中找CString,而不是MFC的。 话说不能对MFC的CString进行继承,然后通过新的作用域来使用CString,以与tc中的CString区分?

不能,VS2019中只要包含头文件,在tc命名空间里有CString的定义,就编译出错了,还没用using namespace tc,还没找到原因。
相门三少 2019-08-22
  • 打赏
  • 举报
回复
目前看,用了using namespace tc之后,调用MFC的CString时,会从tc中找CString,而不是MFC的。 话说不能对MFC的CString进行继承,然后通过新的作用域来使用CString,以与tc中的CString区分?
tiger波波 2019-08-21
  • 打赏
  • 举报
回复
最简单的方式是不要加using namespace tc; 改为tc::Cstring和CString
pstrunner 2019-08-21
  • 打赏
  • 举报
回复
引用 52 楼 redleafe 的回复:
[quote=引用 50 楼 pstrunner 的回复:] SDK没有Sample吗?
SDK提供的示例是VS下32位的控制台示例,没有MFC的示例。 我现在的开发环境是WIN10 64位,VS2019 64位 MFC。 [/quote] 使用MFC的类,则CString肯定是全局的。我提供下示例代码,看看是不是楼主想要的,我创建的是dialog的MFC工程。

// 头文件[CTcAdapter.h]
#pragma once

// 对tc库进行单独的命名空间封装
namespace mytc {
	class CString {
	public:
		CString() { }
		~CString() {}
	};
}

// 外部调用的Adapter
class CTcAdapter
{
public:
	CTcAdapter(void);
	~CTcAdapter(void);
public:
	int CallTcSdk(CString obj);
};

// 实现文件[CTcAdapter.cpp]
#include "stdafx.h"
#include "TcAdapter.h"


CTcAdapter::CTcAdapter(void)
{
}


CTcAdapter::~CTcAdapter(void)
{
}

int CTcAdapter::CallTcSdk(CString obj)
{
	printf("Enter CallTcSdk()\n");
	mytc::CString sdkString;
	return 0;
}

枭. 2019-08-21
  • 打赏
  • 举报
回复
可以用::Cstring或在tc命名空间里再定义一个命名空间
redleafe 2019-08-21
  • 打赏
  • 举报
回复
引用 54 楼 pstrunner 的回复:
[quote=引用 52 楼 redleafe 的回复:]
[quote=引用 50 楼 pstrunner 的回复:]
SDK没有Sample吗?

SDK提供的示例是VS下32位的控制台示例,没有MFC的示例。

我现在的开发环境是WIN10 64位,VS2019 64位 MFC。
[/quote]
使用MFC的类,则CString肯定是全局的。我提供下示例代码,看看是不是楼主想要的,我创建的是dialog的MFC工程。

// 头文件[CTcAdapter.h]
#pragma once

// 对tc库进行单独的命名空间封装
namespace mytc {
class CString {
public:
CString() { }
~CString() {}
};
}

// 外部调用的Adapter
class CTcAdapter
{
public:
CTcAdapter(void);
~CTcAdapter(void);
public:
int CallTcSdk(CString obj);
};



// 实现文件[CTcAdapter.cpp]
#include "stdafx.h"
#include "TcAdapter.h"


CTcAdapter::CTcAdapter(void)
{
}


CTcAdapter::~CTcAdapter(void)
{
}

int CTcAdapter::CallTcSdk(CString obj)
{
printf("Enter CallTcSdk()\n");
mytc::CString sdkString;
return 0;
}

[/quote]

我测试下,非常感谢。
您的代码:
namespace mytc {
class CString {}
........
}
如何告诉编译器您这段代码中CString是mytc命名空间内的,而不是全局的MFC的CString?
我上次测试时,编译是报这里不明确的。
无尝试了加tc::来限定,也不行。
有没有标识符来表明这是个局部类?

redleafe 2019-08-21
  • 打赏
  • 举报
回复
引用 55 楼 tiger波波 的回复:
最简单的方式是不要加using namespace tc;
改为tc::Cstring和CString

在VS2019 MFC下测试了,不使用using namespace tc,只包含头文件就编译报错,说系统的头文件中的CString类型不明确,还没有对tc命名空间里的CString进行任何操作。
pstrunner 2019-08-20
  • 打赏
  • 举报
回复
SDK没有Sample吗?
  • 打赏
  • 举报
回复
不使用 using namespace tc; tc名字空间里面的类型重新定义一下: 比如typedef tc::CString tcCString;。 使用的时候,也能比较明确。
redleafe 2019-08-20
  • 打赏
  • 举报
回复
引用 50 楼 pstrunner 的回复:
SDK没有Sample吗?

SDK提供的示例是VS下32位的控制台示例,没有MFC的示例。

我现在的开发环境是WIN10 64位,VS2019 64位 MFC。
redleafe 2019-08-20
  • 打赏
  • 举报
回复
引用 41 楼 走好每一步 的回复:
减少头文件的依赖,避免作用域的扩散,少给自己添麻烦是真的舒服一些

好的,尝试下脱离命名。谢谢
我测试好了就结贴。

引用 48 楼 嘟嘟洒水车 的回复:
不要在.h文件里用using namespace!!严禁使用!!删掉!
cpp里面就用CString和tc::CString,也别用using namespace。

谢谢,在VS2019下的MFC中,只要包含头文件,不用using namespace,都依然报错,像CString这样的类,就不允许在自己的命名空间里定义。
所以,还是需要能限定命名空间作用域的方法。
嘟嘟洒水车 2019-08-19
  • 打赏
  • 举报
回复
不要在.h文件里用using namespace!!严禁使用!!删掉! cpp里面就用CString和tc::CString,也别用using namespace。
加载更多回复(45)

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧