1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <iostream> // ::f void f (int i) { std::cout << "::f\n" ; } // Simple case void OK1() { f (99) ; // Calls ::f } // Argument-dependend lookup namespace MyNamespace { struct S { int i ; } ; void f (S& s) { std::cout << "MyNamespace::f\n" ; } } void OK2() { MyNamespace::S s ; f (99) ; // Calls ::f f (s) ; // Calls MyNamespace::f because the type of s is declared in MyNamespace } // Declaration of a class member (#1) struct C { static void ERROR1() { MyNamespace::S s ; f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#1) } static void f() { // Declaration of a class member (#1) std::cout << "C::f\n" ; } } ; // Block-scope function declaration (#2) void ERROR2() { void f() ; // Block-scope function declaration (#2) MyNamespace::S s ; f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#2) } // Declaration that is neither a function or a function template (#3) void ERROR3() { MyNamespace::S s ; f (s) ; // OK -- ::f called typedef int f[3] ; // Declaration that is neither a function or a function template (#3) f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#3). This is an initialiser } |
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gOjpmCnZvaWQgZiAoaW50IGkpIHsgc3RkOjpjb3V0IDw8ICI6OmZcbiIgOyB9CgovLyBTaW1wbGUgY2FzZQp2b2lkIE9LMSgpIHsKICBmICg5OSkgOyAvLyBDYWxscyA6OmYKfQoKLy8gQXJndW1lbnQtZGVwZW5kZW5kIGxvb2t1cApuYW1lc3BhY2UgTXlOYW1lc3BhY2UgewpzdHJ1Y3QgUyB7IGludCBpIDsgfSA7CnZvaWQgZiAoUyYgcykgeyBzdGQ6OmNvdXQgPDwgIk15TmFtZXNwYWNlOjpmXG4iIDsgfQp9Cgp2b2lkIE9LMigpIHsKICBNeU5hbWVzcGFjZTo6UyBzIDsKICBmICg5OSkgOyAgIC8vIENhbGxzIDo6ZgogIGYgKHMpIDsgICAgLy8gQ2FsbHMgTXlOYW1lc3BhY2U6OmYgYmVjYXVzZSB0aGUgdHlwZSBvZiBzIGlzIGRlY2xhcmVkIGluIE15TmFtZXNwYWNlCn0KCi8vIERlY2xhcmF0aW9uIG9mIGEgY2xhc3MgbWVtYmVyICgjMSkKc3RydWN0IEMgewogIHN0YXRpYyB2b2lkIEVSUk9SMSgpIHsKICAgIE15TmFtZXNwYWNlOjpTIHMgOwogICAgZiAocykgOyAgICAgICAgLy8gRXJyb3I6IE15TmFtZXNwYWNlOjpmIG5vdCBtYXRjaGVkLCBiZWNhdXNlIFkgaXMgZW1wdHkgKCMxKQogIH0KICBzdGF0aWMgdm9pZCBmKCkgeyAvLyBEZWNsYXJhdGlvbiBvZiBhIGNsYXNzIG1lbWJlciAoIzEpCiAgICBzdGQ6OmNvdXQgPDwgIkM6OmZcbiIgOwogIH0KfSA7CgovLyBCbG9jay1zY29wZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiAoIzIpCnZvaWQgRVJST1IyKCkgewogIHZvaWQgZigpIDsgLy8gQmxvY2stc2NvcGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gKCMyKQogIE15TmFtZXNwYWNlOjpTIHMgOwogIGYgKHMpIDsgICAgLy8gRXJyb3I6IE15TmFtZXNwYWNlOjpmIG5vdCBtYXRjaGVkLCBiZWNhdXNlIFkgaXMgZW1wdHkgKCMyKQp9CgovLyBEZWNsYXJhdGlvbiB0aGF0IGlzIG5laXRoZXIgYSBmdW5jdGlvbiBvciBhIGZ1bmN0aW9uIHRlbXBsYXRlICgjMykKdm9pZCBFUlJPUjMoKSB7CiAgTXlOYW1lc3BhY2U6OlMgcyA7CiAgZiAocykgOyAgICAgICAgICAgIC8vIE9LIC0tIDo6ZiBjYWxsZWQKICB0eXBlZGVmIGludCBmWzNdIDsgLy8gRGVjbGFyYXRpb24gdGhhdCBpcyBuZWl0aGVyIGEgZnVuY3Rpb24gb3IgYSBmdW5jdGlvbiB0ZW1wbGF0ZSAoIzMpCiAgZiAocykgOyAgICAgICAgICAgIC8vIEVycm9yOiBNeU5hbWVzcGFjZTo6ZiBub3QgbWF0Y2hlZCwgYmVjYXVzZSBZIGlzIGVtcHR5ICgjMykuIFRoaXMgaXMgYW4gaW5pdGlhbGlzZXIKfQ==
prog.cpp: In static member function 'static void C::ERROR1()': prog.cpp:27:9: error: no matching function for call to 'C::f(MyNamespace::S&)' prog.cpp:29:15: note: candidate is: static void C::f() prog.cpp: In function 'void ERROR2()': prog.cpp:38:7: error: too many arguments to function 'void f()' prog.cpp:36:8: note: declared here prog.cpp: In function 'void ERROR3()': prog.cpp:46:7: error: conflicting declaration 'int s [3]' prog.cpp:43:18: error: 's' has a previous declaration as 'MyNamespace::S s'
-
result: Compilation error (maybe you wish to see an example for C++11)


