Пытаясь понять другой вопрос, я упростил пример, получив следующий код.
template <bool>
struct foo
{
template <typename T>
auto bar (int i)
{ return i; }
};
template <>
template <typename T>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
g++ 4.9.2 компилирует без проблем; clang++ 3.5 выдает следующую ошибку
tmp_003-14,gcc,clang.cpp:12:20: error: out-of-line definition of 'bar' does not
match any declaration in 'foo<true>'
auto foo<true>::bar (int i)
^~~
Заменив одно из двух возвращаемых значений auto
на int
, изменений нет: g++ compile и clang++ выдают ошибку. Заменив оба auto
на int
, ошибка исчезнет.
Часть template <typename T>
важна, потому что следующий код без проблем компилируется обоими компиляторами.
template <bool>
struct foo
{
auto bar (int i)
{ return i; }
};
template <>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
Мой вопрос очевиден: кто прав?
г++ или клан++?
Я предполагаю, что g++ прав и что это ошибка от clang++, но я прошу подтверждения.
p.s.: извините за мой плохой английский.