Код: Выделить всё
template struct Int {
constexpr auto dec() const -> Int {
return {};
}
constexpr operator int() const {
return N;
}
};
constexpr auto fib(Int) -> Int {
return {};
}
template constexpr auto fib(Int n) -> decltype(fib(n.dec())) {
return {};
}
static_assert(fib(Int()) == 0);
namespace foo {
template struct Int {
constexpr auto dec() const -> Int {
return {};
}
constexpr operator int() const {
return N;
}
};
}
template using Int = foo::Int;
constexpr auto fib(Int) -> Int {
return {};
}
template constexpr auto fib(Int n) -> decltype(fib(n.dec())) {
return {};
}
static_assert(fib(Int()) == 0);
< /code>
Со следующим сообщением об ошибке: < /p>
:21:15: error: no matching function for call to 'fib'
21 | static_assert(fib(Int()) == 0);
| ^~~
:14:16: note: candidate function not viable: no known conversion from 'Int' to 'Int' for 1st argument
14 | constexpr auto fib(Int) -> Int {
| ^ ~~~~~~
:17:33: note: candidate template ignored: substitution failure [with N = 2]: call to function 'fib' that is neither visible in the template definition nor found by argument-dependent lookup
17 | template constexpr auto fib(Int n) -> decltype(fib(n.dec())) {
| ^ ~~~
< /code>
Может ли кто -нибудь объяснить, что здесь происходит? Почему представление пространства имен создает ошибку компилятора?
Подробнее здесь: https://stackoverflow.com/questions/795 ... -namespace