|
Hello everyone,
Any ideas why there is no ambiguity issues in the code? Which myfunc is called?
The code can pass compile and link in Visual Studio 2008 without any warning messages. The output is 100.
int myfunc (int& a) {return 100;}
int myfunc (const int& a) {return 200;}
int main()
{
int a = 1;
int& ra = a;
int rtn;
rtn = myfunc (ra);
return 0;
}
thanks in advance,
George
|
|
|
|
|
is n't it obvious.
try also,
1)
const int& ra = a;
rtn = myfunc (ra); // output 200
2)
int& ra = a;
rtn = myfunc (const_cast<const int&>(ra)); // output 200
And why ambiguity.
|
|
|
|
|
Hi Rajkumar,
The ambiguity in my original code is, ra is a non-const reference, it can match both non-const reference and const reference. If you try to commet out the version of myfunc which accepts non-const reference, the code still works and output 200, so both matches and there should be at least an ambiguity error or warning? Why?
regards,
George
|
|
|
|
|
yes, i am taking my word (isn't it obvious).
you will get answer for this here Argument Matching[^]
abstract: takes best match.
|
|
|
|
|
|
I know your post on ambiguity is based on our discussion on qualifier on base type.
we already discussed this, and Argument Type Differences [^], but iam sure you will find buggy sample i this link.
I don't have much more to say on qualifier on base type and qualifier on reference type, any way i try this,
int func(int &); and int func(const int &) has exclusive presence,
say, const int &ra = a; can be passed to func(ra) only if the second one exists.
while in, "int func(int )" and "int func(const int )" no exclusive presence.
|
|
|
|
|
Thanks Rajkumar,
Your reply is just what I want to have, cool! Especially the following statements from the link you recommended,
--------------------
For the same reason, function arguments of a type modified by const or volatile are not treated differently than the base type for the purposes of overloading.
However, the function overloading mechanism can distinguish between references that are qualified by const and volatile and references to the base type. This makes code such as the following possible:
--------------------
regards,
George
|
|
|
|
|
George,
Consider the 'best-match' rule. Both functions are acceptable, but one of them has better match for arguments than the other; i.e. myfunc(int&) better matches to the given argument then myfunc(const int&).
--
=====
Arman
|
|
|
|
|
Thanks Arman,
But if we remove & and change code to the following segment,
int myfunc (int a) {return 100;}
int myfunc (const int a) {return 200;}
There will be duplicated defined function error. So I think the rules are,
1. (as you said) compiler allow more than one matched function exist, but has a priority to match them;
2. (as I showed above) for const reference and non-const reference, compiler will treat them of two different functions, but for non-const value and const value, compiler will treat them as same functions.
My conclusions (1) and (2) are correct?
regards,
George
|
|
|
|
|
Can we draw a colored rectangle (symbol) in a tootltip? I need a tooltip which displays multiline text, that is, each row(line)in the tooltip will have a colored rectangle and text displyed next to it.
|
|
|
|
|
|
You can put an icon in fancy new balloon tooltips (and I do so for a tray app I wrote).
But multilines with varous graphical symbols, you'll have to make your own window.
Have look at Paul DiLascia's June 2001 MSDN Magazine article, where he does a CPopupText window - and adapt it with as many pics as you can shake a stick at.
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
Hello everyone,
For the MSDN sample,
http://msdn2.microsoft.com/en-us/library/2af6btx2.aspx
template <class U>
struct rebind { typedef stingyallocator<U> other; };
My question is, what is the purpose of defining an internal struct which has only a type? How to use it? Why class U is different from _Ty?
(I see similar code in STL internal implementation for allocator class, seems like a pattern which I do not know.)
thanks in advance,
George
|
|
|
|
|
There is the allocator::rebind documentation in MSDN.
Maxwell Chen
|
|
|
|
|
|
George_George wrote: So, I think the purpose of this pattern is to change the template parameter (input type parameter to outer struct) to another one?
I guess so. I traced vector class (VC++2005), and found it rebind the outer type, _Ty , again (type no change).
Maxwell Chen
|
|
|
|
|
Thanks Maxwell,
Question answered.
regards,
George
|
|
|
|
|
dear all
my problem is below, anyone help me to check, thanks a lot.
T,sigma,maskSize,halfSize are all declared.
for (int k=0;k<5;k++)
{
halfSize = static_cast<int>(sqrt(-log(T))*2*pow(sigma[k],2));
maskSize = 2*halfSize + 1;
int Mask[k][maskSize][maskSize];
int valueX[k][maskSize][maskSize];
int valueY[k][maskSize][maskSize];
}
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
so anyone help me. thanks
Li Zhiyuan
|
|
|
|
|
If you want to allocate an array from which you don't know the size at compile time (you only know it at runtime), then you need to use new.
It is quite basic C++ stuff and it is not the first time you ask that question (even if people already answered you). I think it would be great for you to learn C++ from the start. So, buy a good book and take some time to learn it correctly. You might spend some time on it but at the end, you will be much more efficient. Just an advice though...
|
|
|
|
|
thanks, i already bought c++ fifth edition book, but so few pages to introduce new and delete, any code or stuff are available for me? thanks a lot
Li Zhiyuan
|
|
|
|
|
Which part of "Read the forum guidelines" do you not understand?
Each time you use these idiotic subject lines "Need Help", "Urgent!!!!! Help!!!!!!!!!!!!!!!!!", etc. you are told to use subject lines that actually describe the problem briefly but you simply refuse to do that. Not to mention that this has been going on for almost 2 years.
What is your malfunction?
|
|
|
|
|
thanks sir.do you have any such stuff or code? thanks
Li Zhiyuan
|
|
|
|
|
int** myArray;
myArray = new int*[10];
for (int i=0;i<10;i++)
{
myArray[i] = new int[20];
}
So, now you have a 2D array. Don't forget to delete everything once you are done. Here the same applies: you need to delete each row first and then delete the root pointer. I leave you that as an exercice to see if you understand the concept .
|
|
|
|
|
what about vector vector combination!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You/codeProject$$>
|
|
|
|
|
Cranky wrote: Not to mention that this has been going on for almost 2 years.
But, I think he is not a native English speaker. However, 2 years into CP and that won't make an excuse.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|