So. I typo’ed up some template code the other day. And once again I learned the importance of using several c++ compilers.
Here is a very reduced version of my code:
1 2 3 4 5 6 7 8 9 10 |
#include <utility> template <typename T> auto foo(const T& t) -> decltype(x.first) { return t.first; } int main() { foo(std::make_pair(1,2)); return 0; } |
And let’s start with the compiler I was testing with first.
MSVC (2013 and 2015)
1 2 |
main.cpp(8): error C2672: 'foo': no matching overloaded function found main.cpp(8): error C2893: Failed to specialize function template 'unknown-type foo(const T &)' |
It is not completely clear from that error message what’s going on, so let’s try some other compilers:
GCC (4.9-5.3)
1 2 |
2 : error: 'x' was not declared in this scope template <typename T> auto foo(const T& t) -> decltype(x.first) |
That’s pretty clear. More compilers:
Clang (3.3-3.7)
1 2 |
2 : error: use of undeclared identifier 'x' template <typename T> auto foo(const T& t) -> decltype(x.first) |
ICC (13)
1 2 |
example.cpp(2): error: identifier "x" is undefined template <typename T> auto foo(const T& t) -> decltype(x.first) |
(Yes. I mistyped the variable name used for decltype. Replacing the x with t makes it build).
Thanks to http://gcc.godbolt.org/ and http://webcompiler.cloudapp.net/ for testing with various compilers.
You do not need to write ‘ -> decltype(x.first)’ if you can compile your code with ‘-std=c++14’.