|
I don't understand why you do not use the CStringT [^] class, which already includes the code for overloading the + operator. What extra functionality does your derived class offer that CStringT does not already include?
The best things in life are not things.
|
|
|
|
|
I think you need to bite the bullet and convert all your char variables and constants to TCHAR. If you do not, you will continue to have problems like this. If it were easy to solve the multi-byte to Unicode to multi-byte character conversion issues that solution would be part of the CString class.
The changes you need to make are mechanical. You need to put _T() around all your string and character literals. You need to change all your char variables to TCHAR.
I don't know how big your project is, or if you have access to all the source. I suspect you have spent more time trying to avoid the issue than a proper fix would require.
|
|
|
|
|
You cannot use casting to convert from a large element type to a smaller one without potential loss of data, you must use some form of conversion. If you stick with the default CString [^] class it will handle either char or wchar_t depending on your project settings. If your project needs to use both Unicode and MBCS then you need to provide conversion functions at the appropriate parts of your application. If it will only ever use one or the other but you need to provide a version that will handle each type then use TCHAR as the type for all your character variables and _T("constant string") macros for all constants. That way you can simply rebuild your project to handle the appropriate encoding.
The best things in life are not things.
|
|
|
|
|
thanks for your reply.
TCHAR was a great help.
I am facing another problem, while implementing the same. could you please take a look and follow the above comments of mine.
thanks in advance
Hrishi
|
|
|
|
|
Hello all,
I need to avoid MFC from my existing project, and convert to ATL. I am using STL for the most of the conversion (defining my own class for MFC type)
CString has been use extensively in the project. So I guess its better to implement my own CString class. So that I dont need to touch all the implementation.
I found out that ATL also has CString
typedef CAtlString CString;
So, if project setting avoids MFC, then CString will be refererd from this ATL CString class. But the problem is I need to touch and convert many code like
"xx" to L"xx"
char to wchar_t
Can I have a efficient way, in order to avoid touching much implementation, and character code supportness.
Shall I override this ATL CString class? or better right my own?
considering about the supporting of character type (Unicode/others), could you Please suggest me, or advice me.
thanks in advance
Hrishi
|
|
|
|
|
The reason you're having those issues is that your original project probably had a setting of "Use Multi-Byte" characters or "ASCII" or something similar and now you seem to be attempting to use unicode. If you change you new project settings to use multi-byte characters or ASCII you won't have that problem but if you must use unicode, then you'll have to face the issue regardless. There may be some macros out there to help you out though, try searching google for them. Macros can be error prone however, so if its your intention to continue with unicode then you'll have to address the character and string definitions.
|
|
|
|
|
I use CString all the time but not the ATL::Cstring
It seems to be handy with MessageBox and other system calls so I use it all the time
What is the issue with CString that is bothering you?
http://www.contract-developer.tk
|
|
|
|
|
Why did you post that as a reply to me?
|
|
|
|
|
use find and replace tool to replace ' "' to ' L"'.
|
|
|
|
|
I have some MFC code that positions a combobox on a dialog using SetWindowPos. This works fine at 96 DPI but the dropdown fails at 150 DPI (it doesn't show).
SetWindowPos is apparently setting the size and position of the combo and the dropdown at 150 DPI - that's fair enough, we can work around it. But why does it work at all at 96 DPI?
|
|
|
|
|
I've never noticed this before, but if so... that should cause all sorts of anomalies in peoples code I would imagine... Good question.
|
|
|
|
|
Hello everyone
Could anyone please tell me, is there any way to separate the definition of the methods of a template class ,from header file to .cpp file.
I know the way, wherein, we define all the methods in a file( with extension other then .cpp), and include the file at the end of the header file of the template class.
But this method looks no good, is there any clean and usual way just like other class.
thanks in advance
Hrishi
|
|
|
|
|
The reason for placing definitions in a header file is so that they can be included in many implementation (.cpp ) files. If your definitions are only used within one implementation file then you can put them at the top of that file.
Or did I misunderstand your question?
The best things in life are not things.
|
|
|
|
|
Yes sure, thanks . .But I want to know is there any way that I can separate the definitions of methods, in a .cpp file, (just like what we do for normal classes) . . . .[I tried , although there is no syntax error, but it shows linking errors]........ FOR SOME REASON , I DON'T WANT TO PUT THE METHOD'S DEFINITIONS IN .h FILE.........
thanks again
hrishi
|
|
|
|
|
hrishi321 wrote: but it shows linking errors
That has nothing to do with whether your source is in a .h or .cpp file. Link errors occur when you have references to objects or methods which do not exist within your program.
hrishi321 wrote: FOR SOME REASON , I DON'T WANT TO PUT THE METHOD'S DEFINITIONS IN .h FILE
1. Please do not SHOUT, we can read in normal case perfectly well.
2. You can put your definitions anywhere you like. The only requirement is that the compiler can find them when it comes across a reference in the source code. For example a statement of the form:
CThing thing = new CThing();
requires a definition of CThing , and that definition must already exist in the compiler's dictionary, having been found either in an included .h file, or previously in the current source .cpp file.
The best things in life are not things.
|
|
|
|
|
thanks a lot, for all the points.
But i am sorry, I really didn't get my answer... so does it mean to say, that I can put my class(template) method definitions in .cpp file??
Regards,
hrishi
|
|
|
|
|
hrishi321 wrote: does it mean to say, that I can put my class(template) method definitions in .cpp file?
Yes; I thought I had explained this in my previous two answers; obviously my explanations need some work.
The best things in life are not things.
|
|
|
|
|
Hello again
thanks for your all reply...for the same doubt, if you don't mind, could you please have a look at the comments and reply below (Mr. Albert), since it has an clear cut example and my doubt.
thanks in advance
Hrishi
|
|
|
|
|
Question is not very clear as to what you're trying to do, try clarifying what you're trying to accomplish.
|
|
|
|
|
thanks for ur reply.... ok, I have a class template with few methods....according to my knowledge, we have to put the definitions of all template-class-methods in .h files itself .....actually , FOR SOME REASON , I DON'T WANT TO PUT THE METHODS DEFINITIONS IN .h FILE.......i want to put them in .cpp file, just like other normal classes that we do......is it possible? if so, how?....
thanks in advance
Hrishi
|
|
|
|
|
You don't have to put the definitions in the header, just the declarations.
In header file:
template <class T> class CMyTemplate
{
public:
virtual void Method1(void*);
};
In cpp file:
template <class T>
void CMyTemplate<T>::Method1(void*){}
|
|
|
|
|
Hello again
thanks for ur reply... yes, so say in this program, here is the problem i am facning...
Now in the main function, if I try to create an object . .like
CMyTemplate<int> objT;
it gives me linking error
error LNK2001: unresolved external symbol "public: virtual void __thiscall CMyTemplate<int>::Method1(void *)" (?Method1@?$CMyTemplate@H@@UAEXPAX@Z)
waiting for your reply..
thanks
hrishi
|
|
|
|
|
Where is the code for Method1() ? I find it rather difficult to understand why you are using templates when you seem not to have mastered the basics of classes yet.
The best things in life are not things.
|
|
|
|
|
Code In xxx.h file ::>>
--------------------------------------
template <class T>
class CMyTemplate
{
public:
virtual void Method1(T TDummy);
};
Code in xxx.cpp file ::>>
--------------------------------------
#include "xxx.h"
template <class T>
void CMyTemplate<T>::Method1(T TDummy)
{
TDummy = TDummy + 1;
}
Code in main function ::>>
--------------------------------------
CMyTemplate<int> objT;
|
|
|
|
|
I cannot see anything wrong with this, and I have copied it into a test program of my own and it compiles and links successfully. There must be something different in your implementation that you have not shown in your message.
Also, please surround your code snippets with <pre> tags (use the code block button) so it shows more clearly, like this:
template <class T>
void CMyTemplate<T>::Method1(T TDummy)
{
TDummy = TDummy + 1;
}
The best things in life are not things.
|
|
|
|