|
Thanks BadKarma,
BadKarma wrote: the VC compilter correctly choses the i defined in the base class.
According to our discussion, this is not standard compatible behavior, agree? A compile error should be reported in this case if no global i is defined.
regards,
George
|
|
|
|
|
This is a known issue in Visual C++. Microsoft document this non-standard behaviour here[^].
I wouldn't be surprised to find that a fair bit of ATL would need to be rewritten when this issue is fixed.
DoEvents: Generating unexpected recursion since 1991
|
|
|
|
|
|
A template is instantiated for a given set of parameters when it is first used, so it is g('c') which instantiates g<char> . The template argument is deduced from the type of the argument to the function call.
The problem here is that the standard calls for anything not dependent on the template parameters (the stuff between <> ) to be bound at the point that the template is defined, not the point that it is instantiated. Only those references that depend upon the template parameters are supposed to be deferred until the point that the template is instantiated.
In the example given at that link:
namespace N {
void f(int) { printf("f(int)\n");}
}
template <class T> void g(T) {
N::f('a');
}
namespace N {
void f(char) { printf_s("f(char)\n");}
}
int main() {
g('c');
} The standard says that when the definition of g(T) is encountered, anything not explicitly dependent on the argument T should be bound. At this point we have encountered the declaration of N::f(int) but not yet the declaration of N::f(char) . Because char is implicitly convertable to int, a standard-compliant compiler would bind to N::f(int) . If the declaration of N::f(int) wasn't there, an error would occur.
Visual C++ at present does not do this first step of binding and defers all name resolution to the point of instantiation. This is when the call to g is encountered. At this point the compiler has seen both overloads of N::f so it binds to N::f(char) as that is the best match.
Say instead the declaration of g were:
template <class T> void g(T t) {
N::f(t);
} Now the call to N::f is dependent on the type of the parameter t which is the template argument T . Here, the compiler cannot bind the call to N::f when it encounters the template definition because it does not know what T is. It has to defer it until the template is instantiated. When the call to g('c') is encountered, it knows that the type parameter T is char , so it generates a call to N::f(char) . This is true of both Visual C++ and a standards-compliant compiler.
In your original example, the use of the variable i is not explicitly dependent on the template argument T so it is assumed not to be dependent. A standard compiler tries to bind to a global i and generates an error if one is not found. Visual C++ will wait until the template is instantiated and bind to the base class's i member as that is the closest i in scope at the point of instantiation. To make the standards compiler wait until the point of instantiation, you have to make the expression depend on the base class: if i is expected to be an instance member, use this->i , otherwise if it's a static member use Base<T>::i .
DoEvents: Generating unexpected recursion since 1991
|
|
|
|
|
Thanks Mike,
Your reply is cool and makes me clear about more things. I stuied my original question again, and modify the sample to make it more clear to debug. I have tried to use your analysis above to explain why if we comment the cout d.get_i() statement, there will be compile error, but if we comment it out, there will not be compile error.
Any ideas?
Compile errors are,
1>------ Build started: Project: test_template4, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>d:\visual studio 2008\projects\test_template4\test_template4\main.cpp(20) : error C2065: 'i' : undeclared identifier
1> d:\visual studio 2008\projects\test_template4\test_template4\main.cpp(20) : while compiling class template member function 'int Derived<T>::get_i(void)'
1> with
1> [
1> T=int
1> ]
1> d:\visual studio 2008\projects\test_template4\test_template4\main.cpp(26) : see reference to class template instantiation 'Derived<T>' being compiled
1> with
1> [
1> T=int
1> ]
#include <iostream>
using namespace std;
template <typename T> struct Base {
public:
Base (int _i): i (_i)
{
}
int i;
};
template <typename T> struct Derived : public Base<T> {
public:
Derived (int _i) : Base<T> (_i)
{
}
int get_i() { return i; }
};
int main()
{
Derived<int> d (200);
cout << d.get_i() << endl;
return 0;
}
regards,
George
|
|
|
|
|
I m working on Audio and video related software.
i want to attach bar visulizer for audio file(just Like window media player's Bar visulizer).
but i dont want to use ActiveX cotrol.
Please anyone can help me for this.
Thanks in advance.
|
|
|
|
|
Hi Everybody,
I m developing a Task manager like application. I m able to enumerate the process list. But i m not able to get the active window list. That is the content of the first tab in the task Manager. Can anybody help me please??
|
|
|
|
|
EnumWindows() and GetWindowThreadProcessId() to get the lop level application window and there by its process id;
|
|
|
|
|
EnumWindows() returns all toplevel windows including tooltip classes and many other windows which is unwanted for a 'Task manager like application'.
How to seperate main windows from them extactly as Windows TaskManager does ?
|
|
|
|
|
nitin3 wrote: How to seperate main windows from them extactly as Windows TaskManager does ?
I don't know about TaskManager, My Idea is to filter the windows in the list.
while enumerating windows query for a number of properties of the window
GetWindowInfo() or GetWindowLong()
and various conditions can be satisfied : like,
Is the window an application window? WS_EX_APPWINDOW (listed in task bar)
Is it visible? WS_VISIBLE, IsWindowVisible
Is it a ToolWindow? WS_EX_TOOLWINDOW
and so on.
|
|
|
|
|
Hi Everybody,
Thanks a lot. I have solved the problem with EnumWindows and IsWindowsVisible APIs.
Thank you once again
P.Somasundaram
|
|
|
|
|
Hello everyone,
I have searched web, wikipedia and some books. But can not find a exact definition for what is qualified name and unqualified name. Here is a small part from Bjarne's book, for example.
I think qualified name means names with namespace qualifier in this context? Unqualified name means no namespace qualifier ahead of a name? Correct or not?
--------------------
Not can an unqualified name used in a template ever be bound to a local name. Finally, even if a template is first used within a class, unqualified names used in the template will not be bound to members of that class. Ignoring lcoal names is essential to prevent a lot of nasty macro-like behavior.
section C.18.3.3 Point of Instantiation Binding
--------------------
thanks in advance,
George
|
|
|
|
|
Your post this time is highly related with the name-lookup issue last time. Please read that GCC document again.
Maxwell Chen
|
|
|
|
|
Thanks Maxwell,
I understand what name-lookup issue is. My question is what is qualified name and unqualified name. And what means qualified name and unqualified name in the context I quoted in the original question.
Actually, I have made some search and study but can not find a definition for them. Any ideas?
BTW: GCC document is fine, is there definition for qualified name and unqualified name?
regards,
George
|
|
|
|
|
Hi Maxwell,
I have just searched for GCC manual for gcc version 4.2.3, no definition for what is qualified name and what is unqualified name.
Any comments?
regards,
George
|
|
|
|
|
George, I saw this time your question falls into the category about template instantiation (as in the quote in the OP).
(I really hate to post URL links at work because my domain server blocks the copy-and-paste function. I have to manually type each alphabets of a URL ... )
Here is the document:
GCC: Name lookup[^].
Do you see the code snippet below in that article?!
int get_i() { return i; }
And I quote the sentence from the article:
" ... the compiler can't really know what i would refer to. If there is no global variable i, ... "
Maxwell Chen
|
|
|
|
|
Hi Maxwell,
I will read the document. And query you any additional issue. Just intereted in your below comments,
Maxwell Chen wrote: because my domain server blocks the copy-and-paste function
how could a server (domain server? DNS?) blocks the IE operation (copy and paste some web pages) on client? curious?
regards,
George
|
|
|
|
|
George_George wrote: how could a server (domain server? DNS?) blocks the IE operation (copy and paste some web pages) on client? curious?
When a Windows workstation gets joined into a domain, the domain policies defined in the domain server override the local policies.
You can view and change the policy settings of your Windows operating system, by:
Win + R to launch the "Run" dialog box,
Input this: gpedit.msc
And you get the Group Policy tool, which manages your local policies.
Many behaviours of IE are configured by the policies. One of the policy relates to allowance or rejection of web pages modifying the clipboard data.
This CP forum post edit control modifies something (for example: < and > ). Therefore it gets blocked.
Maxwell Chen
|
|
|
|
|
Cool, Maxwell!
regards,
George
|
|
|
|
|
Hi Maxwell,
In the GCC manual, it is mentioned the following sample is wrong,
template <typename T> struct Base {
int i;
};
template <typename T> struct Derived : public Base<T> {
int get_i() { return i; }
};
But it can compile without any issues in Visual Studio 2008, without any warnings and even if I select disable language extensions to yes.
Any comments?
regards,
George
|
|
|
|
|
George_George wrote: But it can compile without any issues in Visual Studio 2008, without any warnings and even if I select disable language extensions to yes.
I tried VC++ 2005, and got the same result as you did.
I think we should double-check the ISO doc ...
Maxwell Chen
|
|
|
|
|
Thanks for your virification, Maxwell!
It is interesting question. I will start a new thread.
regards,
George
|
|
|
|
|
What this function cl_login does in MFC?
|
|
|
|
|
Nikesh Jagtap wrote: cl_login
I don't know what version of MFC you have, but there's no "cl_login"
in MFC 9.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
you asked this yesterday[^] already. do you only read the answers ?
and what do you think we are ?
can't you just make a simple google or MSDN Search ?
modified on Friday, March 7, 2008 4:49 AM
|
|
|
|