On 09/27/2011 05:11 PM, Gor Gyolchanyan wrote:
I have a question about static and non-static methods overloading. I have this module:-------------------------------------------------------------------------------- /** * Dynamic library interfacing module. */ module dynlib; public: /** * A lazily loaded cached dynamic library. */ class DynLib { public: alias void* Symbol; /** * Loads or returns already loaded dynamic library. */ static DynLib opIndex(in char[] name) { auto lib = name in _libraries; if(lib) return *lib; _libraries[name] = new DynLib(name); return DynLib[name]; } /** * Loads or returns already loaded symbol from this dynamic library. */ Symbol opIndex(in char[] name) { auto sym = name in _symbols; if(sym) return *sym; version(Windows) _symbols[name] = GetProcAddress(_handle, name.toStringz); else version(Posix) _symbols[name] = dlsym(_handle, name.toStringz); return DynLib[name]; } bool empty() @property { return _handle is null; } private: alias void* Handle; static DynLib[string] _libraries; static Symbol[string] _symbols; Handle _handle; this(in char[] name) { version(Windows) _handle = LoadLibraryA(name.toStringz); else version(Posix) _handle = dlopen(name.toStringz, RTLD_NOW); } ~this() { version(Windows) FreeLibrary(_handle); version(Posix) dlclose(_handle); } unittest { DynLib dl; version(Windows) dl = DynLib["OpenGL32.dll"]; version(Posix) dl = DynLib["libGL.so"]; assert(!dl.empty); DynLib.Symbol sym = dl["glClearColor"]; assert(sym !is null); } } private: import std.string: toStringz; version(Windows) import core.sys.windows.windows: LoadLibraryA, FreeLibrary, GetProcAddress; else version(Posix) import core.sys.posix.dlfcn: dlopen, dlclose, dlsym; -------------------------------------------------------------------------------- And when i compile this, i get an unexpected error: -------------------------------------------------------------------------------- dynlib.d(24): Error: function dynlib.DynLib.opIndex called with argument types: ((const(char[]))) matches both: dynlib.DynLib.opIndex(in const(char[]) name) and: dynlib.DynLib.opIndex(in const(char[]) name) dynlib.d(39): Error: function dynlib.DynLib.opIndex called with argument types: ((const(char[]))) matches both: dynlib.DynLib.opIndex(in const(char[]) name) and: dynlib.DynLib.opIndex(in const(char[]) name) dynlib.d(39): Error: cannot implicitly convert expression (opIndex(name)) of type dynlib.DynLib to void* -------------------------------------------------------------------------------- My point is: How can this be ambiguous, when i explicitly call the static method from the class name, not the object and when i call a method from an object, the most obvious choice is the non-static one? Cheers, Gor.
There as been some discussion about this issue and afaik Steve has filed a bug report. Currently, it is possible to call a static method on a class instance.
