<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Compiler-Error über Meta-Template hier möglich?]]></title><description><![CDATA[<p>Habe grade nen ziemlich dummen Bug gefixt.<br />
Der hat mich mehrere Stunden auf Trab gehalten.</p>
<p>Folgender Code:</p>
<pre><code class="language-cpp">typedef void* WindowHandle;
</code></pre>
<p>Eigentlich soll man sowas nicht machen, ich weiss. Aber ich will hier HWND in den Headern vermeiden, damit es XPlatform bleibt. Will nicht wieder mit dem pImpl-Idion rummachen. Das ist immer doppelte Arbeit.</p>
<p>Jetzt folgender Bug, vereinfacht dargestellt:</p>
<pre><code class="language-cpp">Context* createPlatformContext(Window* win)
{
#ifdef WIN32
     return new Win32Context(win-&gt;GetHandle());
#endif
}
</code></pre>
<p>Richtig gewesen wäre in diesem speziellen Fall:</p>
<pre><code class="language-cpp">Context* createPlatformContext(WindowHandle win)
{
#ifdef WIN32
     return new Win32Context(win);
#endif
}
</code></pre>
<p>Die 2te Überladung war noch nicht existent. Aber VC++ hat nicht gemeckert, weil er einfach Window* nach void* gecastet hat scheinbar.</p>
<p>Meine Frage nun:<br />
Kann man den void* Pointer irgendwie spezialisieren damit es bei sowas in Zukunft einen Compilerfehler gibt? Irgendwas aus der Meta-Programmierung?<br />
Danke für eure Hilfe und erstmal gute nacht oder besser guten morgen :p.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290608/compiler-error-über-meta-template-hier-möglich</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 09:21:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290608.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jul 2011 03:06:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Compiler-Error über Meta-Template hier möglich? on Sat, 30 Jul 2011 03:08:13 GMT]]></title><description><![CDATA[<p>Habe grade nen ziemlich dummen Bug gefixt.<br />
Der hat mich mehrere Stunden auf Trab gehalten.</p>
<p>Folgender Code:</p>
<pre><code class="language-cpp">typedef void* WindowHandle;
</code></pre>
<p>Eigentlich soll man sowas nicht machen, ich weiss. Aber ich will hier HWND in den Headern vermeiden, damit es XPlatform bleibt. Will nicht wieder mit dem pImpl-Idion rummachen. Das ist immer doppelte Arbeit.</p>
<p>Jetzt folgender Bug, vereinfacht dargestellt:</p>
<pre><code class="language-cpp">Context* createPlatformContext(Window* win)
{
#ifdef WIN32
     return new Win32Context(win-&gt;GetHandle());
#endif
}
</code></pre>
<p>Richtig gewesen wäre in diesem speziellen Fall:</p>
<pre><code class="language-cpp">Context* createPlatformContext(WindowHandle win)
{
#ifdef WIN32
     return new Win32Context(win);
#endif
}
</code></pre>
<p>Die 2te Überladung war noch nicht existent. Aber VC++ hat nicht gemeckert, weil er einfach Window* nach void* gecastet hat scheinbar.</p>
<p>Meine Frage nun:<br />
Kann man den void* Pointer irgendwie spezialisieren damit es bei sowas in Zukunft einen Compilerfehler gibt? Irgendwas aus der Meta-Programmierung?<br />
Danke für eure Hilfe und erstmal gute nacht oder besser guten morgen :p.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099738</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 30 Jul 2011 03:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler-Error über Meta-Template hier möglich? on Sat, 30 Jul 2011 03:50:49 GMT]]></title><description><![CDATA[<p>typedef ist typedef. Ich würde keinen anderen Typ als genau den aus der &lt;windows.h&gt; nehmen, aus viel zu viel ANgst, daß es irgendwann knallt.</p>
<p>Wie wäre es damit?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
using namespace std;

typedef void* WindowHandle;

struct Window{
    WindowHandle h;
    WindowHandle GetHandle(){
        return h;
    }
};

struct Context{
};

struct Win32Context:Context{
    WindowHandle h;
    Win32Context(WindowHandle h){
        this-&gt;h=h;
    }
    template&lt;typename T&gt;
    Win32Context(T*)=delete;
};

Context* createPlatformContext(Window* win)
{
     return new Win32Context(win-&gt;GetHandle());
}

int main(){
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099740</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 30 Jul 2011 03:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler-Error über Meta-Template hier möglich? on Sat, 30 Jul 2011 07:45:35 GMT]]></title><description><![CDATA[<p>Du hast recht, das war schlecht überlegt. Ich habe ja eine Basisklasse IPlatformWindow und eine Basisklasse IPlatformContext.<br />
Und im Prinzip braucht meine Library ja nur einen Pointer auf das alternative Fenster des Tools und darf new nicht selber aufrufen.<br />
Ich unterscheide jetzt einfach nicht mehr zwischen Tool und internem Fenster. Jedes Tool muss jetzt sein Fenster selber implementieren und kann der allgemeinen Funktion createWindow() alternativ einen Pointer mitgeben. Dieser wird dann auch nicht verwaltet.</p>
<p>Mal wieder ein Fall von zu viel gedacht :D.<br />
Der void* typedef existiert zwar nicht, aber er ist nun weniger gefährlich da ich überall das IPlatformWindow übergeben kann und dann getWindowHandle() aufrufen kann. Darauf muss ich halt einfach achten.</p>
<p>Ein weiterer Vorteil ist, dass jeder der ein Spiel mit meiner Lib macht, sein Fenster auch alternativ selber implementieren kann, anstatt meines zu nehmen.<br />
Das ist viel besser so^^ und ein extra feature ohne Aufwand <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />.<br />
Danke nochmal.</p>
<pre><code class="language-cpp">NLIPlatformWindow* NLSystemController::createWindow(const NLWindowSettings&amp; settings, int minor, NLIPlatformWindow* window)
{
    // Either use the pointer from the user or create the internal window.
    if ( window == NULL )
    {
        m_window = createPlatformWindow();
    }
    else
    {
        m_window = window;
    }

    // Setup the window.
    if ( m_window-&gt;wasCreated() == false )
    {
        if ( m_window-&gt;createWindow(settings) )
        {            
            try
            {
                m_context = createPlatformContext(m_window, NLOpenGLSettings(3, minor, settings.bpp, settings.vsync));
                m_context-&gt;initOpenGL(settings.width, settings.height);
                m_context-&gt;setClearColor(NLCOLOR4F_BLUE);
            }
            catch(NLException&amp; e)
            {
                NLError(std::string(&quot;[NLSystemController] Failed to create Context: &quot;) + e.what());
                delete m_window;
                delete m_context;
                return NULL;
            }

            // Calculate ortho matrix 
            u32 w = static_cast&lt;u32&gt;(settings.getSize().x);
            u32 h = static_cast&lt;u32&gt;(settings.getSize().y);
            this-&gt;onResize(w, h);

            // Connect to resize Event
            m_window-&gt;connectSignalResize(NLBindResizeSlot(NLSystemController, onResize));

            // Load Standard Font Shader
            SystemController().getResourceManager().loadFontShader();
        }
        else
        {
            std::stringstream ss;
            ss &lt;&lt; &quot;[NLSystemController] Cannot create Window!&quot;;
            NLError(ss);
            delete m_window;
            throw NLException(ss.str(), true);
        }
    }
    else
    {
        NLWarning(&quot;[NLSystemController] NLSystemController::createWindow() called, but window already exists.&quot;);
        throw NLException(&quot;[NLSystemController] NLSystemController::createWindow() called, but window already exists.&quot;);
    }
    return m_window;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099747</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 30 Jul 2011 07:45:35 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler-Error über Meta-Template hier möglich? on Sat, 30 Jul 2011 10:54:03 GMT]]></title><description><![CDATA[<p>Was spricht einfach dagegen?</p>
<pre><code class="language-cpp">#ifdef _WIN32
# include &lt;Windows.h&gt;
#endif

#ifdef _WIN32
  typedef HWND WindowHandle;
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099779</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 30 Jul 2011 10:54:03 GMT</pubDate></item></channel></rss>