http://llvm.org/bugs/show_bug.cgi?id=13730
Bug #: 13730
Summary: decltype in declaration does not match up with
definition, causing ambiguous overload
Product: clang
Version: 3.1
Platform: PC
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: C++11
AssignedTo: [email protected]
ReportedBy: [email protected]
CC: [email protected], [email protected]
Classification: Unclassified
Consider this:
#include <utility> // std::declval
using namespace std;
template<typename T>
struct vec {
};
template<typename S, typename T>
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>& v1, const
vec<T>& v2);
template<typename S, typename T>
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>&, const
vec<T>&) {
return vec<decltype(declval<S>() * declval<T>())>();
}
int main() {
vec<double> v1, v2;
v1 * v2;
}
This gives:
amb.cpp:19:5: fatal error: use of overloaded operator '*' is ambiguous (with
operand types 'vec<double>' and 'vec<double>')
v1 * v2;
~~ ^ ~~
amb.cpp:10:44: note: candidate function [with S = double, T = double]
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>& v1, const
vec<T>& v2);
^
amb.cpp:13:44: note: candidate function [with S = double, T = double]
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>&, const
vec<T>&) {
^
1 error generated.
I only intend there to be one function "operator*", that is first declared and
then defined.
Somehow, the presence of "decltype" and "declval" in the return type prevents
the definition from matching up with the declaration, causing an ambiguous
overload?
This is:
Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.1.0
Thread model: posix
With -stdlib=libc++
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs