<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Thank you all for your help. I filed
now a bug report ( <a class="moz-txt-link-freetext" href="http://llvm.org/bugs/show_bug.cgi?id=17528">http://llvm.org/bugs/show_bug.cgi?id=17528</a>) for
this issue.<br>
<br>
Am 09.10.2013 18:50, schrieb Richard Smith:<br>
</div>
<blockquote
cite="mid:CAOfiQq=ts+b18FXqA35807Vcuu9nubUtABNWSzEXVzL9H+jzCg@mail.gmail.com"
type="cite">
<div dir="ltr">
<div class="gmail_extra">On Tue, Oct 8, 2013 at 3:02 PM, Daniel
Schwalbe <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:dansch491@gmail.com" target="_blank">dansch491@gmail.com</a>></span>
wrote:<br>
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div>Hmm, if I do this it gives me another error:<br>
<br>
test.cpp:15:42: error: 'SmartPtrType' following the
'template' keyword does not refer to a template<br>
~SmartUnion()
{m_sptr.SmartPtrType<T>::~SmartPtrType<T>();
}<br>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>This is a bug. (Also, there's no 'template' keyword
here, so the diagnostic is simultaneously wrong in two
different ways.)</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div> Again, g++ takes it without complaining.<br>
<br>
Since I noticed that my original attachment got
scrubbed I am pasting the modified test program
directly. Perhaps the context will help to sort things
out:<br>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>Thanks, this helped.</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div> #include <memory><br>
#include <string><br>
using namespace std;<br>
<br>
//comment this in to see the compiler error<br>
#define show_compiler_error 1<br>
<br>
template<typename T, template<class> class
SmartPtrType = shared_ptr> <br>
struct SmartUnion<br>
{<br>
SmartUnion() {new(&m_sptr)
SmartPtrType<T>();}<br>
<br>
<br>
#ifdef show_compiler_error<br>
~SmartUnion()
{m_sptr.SmartPtrType<T>::~SmartPtrType<T>();
}<br>
#else <br>
<div class="im"> typedef SmartPtrType<T>
smartptr_type;<br>
~SmartUnion()
{m_sptr.smartptr_type::~smartptr_type(); }<br>
</div>
#endif<br>
<br>
union { <br>
SmartPtrType<T> m_sptr;<br>
T * m_ptr;<br>
};<br>
<br>
};<br>
<br>
using namespace std;<br>
int main()<br>
{<br>
SmartUnion<string,shared_ptr> smu;<br>
<br>
return 0;<br>
}<br>
<br>
<br>
Am 08.10.2013 20:08, schrieb Richard Smith:<br>
</div>
<div>
<div class="h5">
<blockquote type="cite">
<div dir="ltr">You need to write
<div><br>
</div>
<div>
m_sptr.SmartPtrType<T>::~SmartPtrType<b><T></b>();<br>
<div class="gmail_extra"><br>
</div>
<div class="gmail_extra">Per 3.4.3/6, "in a
qualified-id of the form
nested-name-specifier[opt]
class-name::~class-name, the second
class-name is looked up in the same scope as
the first". So you can't use the
injected-class-name after the ~, because
it's not visible.</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Tue, Oct 8, 2013
at 10:05 AM, Daniel Schwalbe <span
dir="ltr"><<a moz-do-not-send="true"
href="mailto:dansch491@gmail.com"
target="_blank">dansch491@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0 .8ex;border-left:1px
#ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div>When I add the 'template' keyword
as suggested clang gives me the very
same error. g++ still eats it
without problem.<br>
<br>
Am 08.10.2013 18:23, schrieb David
Blaikie:<br>
</div>
<div>
<div>
<blockquote type="cite">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<br>
<div class="gmail_quote">On
Tue, Oct 8, 2013 at 8:36
AM, Daniel Schwalbe <span
dir="ltr"><<a
moz-do-not-send="true"
href="mailto:dansch491@gmail.com" target="_blank">dansch491@gmail.com</a>></span>
wrote:<br>
<blockquote
class="gmail_quote"
style="margin:0px 0px
0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi,<br>
<br>
I don't know if I
encountered a compiler
bug in clang 3.3 or if
this is one of the many
subtle c++ exceptional
cases:<br>
<br>
When I try to compile
the attached file
(using: clang++
-std=c++11 test.cpp) I
receive a compiler
error:<br>
<br>
"test.cpp:15:42: error:
identifier
'SmartPtrType' in object
destruction expression
does not name a type<br>
~SmartUnion()
{m_sptr.SmartPtrType<T>::~SmartPtrType();
}"<br>
<br>
g++ compiles the file
without problem.<br>
<br>
clang compiles it, too,
if I explicitly
introduce a typedef for
SmartPtrType<T>
and call this typedef
name instead:<br>
<br>
typedef
SmartPtrType<T>
smartptr_type;<br>
~SmartUnion()
{m_sptr.smartptr_type::~smartptr_type();
}<br>
<br>
Is this a subtle
language feature or a
compiler bug?</blockquote>
<div><br>
</div>
<div>I believe this is a
language feature because
the expression is
ambiguous if m_sptr is
type dependent (which I
assume it is)<br>
<br>
The other solution,
rather than introducing
a typedef, is to use the
'template' keyword:<br>
<br>
~SmartUnion()
{m_sptr.template
SmartPtrType<T>::~SmartPtrType();
}<br>
</div>
<div> </div>
<blockquote
class="gmail_quote"
style="margin:0px 0px
0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span><font
color="#888888"><br>
<br>
Daniel<br>
<br>
<br>
<br>
</font></span><br>
_______________________________________________<br>
cfe-users mailing list<br>
<a
moz-do-not-send="true"
href="mailto:cfe-users@cs.uiuc.edu" target="_blank">cfe-users@cs.uiuc.edu</a><br>
<a
moz-do-not-send="true"
href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users"
target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</blockquote>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
<br>
</body>
</html>