Static and non-static method overloading
Timon Gehr
timon.gehr at gmx.ch
Tue Sep 27 08:23:18 PDT 2011
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.
More information about the Digitalmars-d
mailing list