[Bug c++/63263] New: friend declaration of template specialization of function gets confused when specialization was forward declared
carlo at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Sep 14 21:15:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63263
Bug ID: 63263
Summary: friend declaration of template specialization of
function gets confused when specialization was forward
declared
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: carlo at gcc dot gnu.org
The following code snippet should compile, but it doesn't.
template<typename T>
void f(T&, float&)
{
T(1);
}
struct B;
template<>
void f(B&, float&)
{
}
struct B {
friend void f<B>(B&, float&);
};
void g()
{
B b;
float n;
f(b, n);
}
The result is:
troep.cc: In instantiation of ‘void f(T&, float&) [with T = B]’:
troep.cc:22:9: required from here
troep.cc:4:3: error: no matching function for call to ‘B::B(int)’
troep.cc:4:3: note: candidates are:
troep.cc:14:8: note: B::B()
troep.cc:14:8: note: candidate expects 0 arguments, 1 provided
troep.cc:14:8: note: B::B(const B&)
troep.cc:14:8: note: no known conversion for argument 1 from ‘int’ to ‘const
B&’
troep.cc:4: confused by earlier errors, bailing out
Preprocessed source stored into /tmp/ccjzbrcd.out file, please attach this to
your bugreport.
If I either comment out the friend declaration, or move the
specialization to after the struct B declaration (so that the
friend declaration caused the specialization), then it compiles
and works.
clang compiles this fine.
More information about the Gcc-bugs
mailing list