Наконец-то мне удалось свернуть мой монолитный отказ библиотеки библиотеки шаблонов до простого тестового примера. MSVC не согласен с Clang и GCC в том, что код неверен, в основном из-за поиска имени. К сожалению, я не умею читать спецификацию на C++, и я склонен верить Clang и GCC, когда дело доходит до соответствия, но не могли бы вы помочь мне найти соответствующую часть спецификаций, чтобы я мог подать ошибку?Поиск имени с классом шаблона, наследующим по пространствам имен
namespace A
{
template <int _I, int _II>
struct X {};
}
namespace B
{
template <int _J>
struct X {};
// Clang: OK
// GCC: OK
// MSVC: OK
template <int _K>
struct Y
{
Y(const A::X<_K, _K>&,
const X<_K>&) {}
};
// Clang: OK
// GCC: OK
// MSVC: ERROR
template <int _K>
struct Z : A::X<_K, _K>
{
Z(const A::X<_K, _K>&,
const X<_K>&) {}
};
// Clang: ERROR
// GCC: ERROR
// MSVC: ERROR
struct Q : A::X<1, 1>
{
Q(const A::X<1, 1>&,
const X<1>&) {}
};
}
int main()
{
A::X<1, 1> ax;
B::X<1> bx;
B::Z<1> bz(ax, bx);
return 0;
}
три случая:
- Y нет ничего необычного. Он компилируется с обоими компиляторами.
- Ошибка компиляции связана со вторым аргументом ZOR CT, X, не имеющим достаточных аргументов шаблона. Это зависит от поиска имени, чтобы решить, к какому X я отношусь. Насколько я понял из чтения cppreference, наследование от класса не должно вводить его имя в область, когда дело доходит до поиска неквалифицированного имени.
- Если сам класс Q не является шаблоном, все компиляторы отклоняют его. Теперь это та часть, где я полностью теряю почву. Почему имеет значение, является ли класс шаблоном или нет?
Что здесь происходит?
Боковое примечание: здесь вы используете кучу зарезервированных идентификаторов – melak47