Typename в квалифицированном доступе к участникуC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Typename в квалифицированном доступе к участнику

Сообщение Anonymous »

Интересно, должен ли этот фрагмент кода компилировать и какую функцию он должен вызывать. Ситуация в том, что существует структура , чье имя соответствует имени параметра шаблона. Мой вопрос: внутри определения специализации f (где u происходит из t ), означает ли t параметр шаблона или базовый класс?

Код: Выделить всё

template
void f(T t) {
t.T::~T(); // #1 should this compile?
t.T::m(); // #2 should this compile?
}

struct T { ~T() {} void m(){}}; // note named like the typename parameter
struct U : private T { ~U() {} void m(){}}; // note inherits from T

int main()
{
f(U{});
}
Ну, от наивного взгляда, он должен компилировать #1 и #2, и найти u :: m () и называет деструктор u ;
Но я попробовал это на компиляторах, используя Godbolt https://godbolt.org/z/3kg8m5xvb, и поведен. /> На кланге это называет деструктор u , но он пытается вызвать базовую функцию члена :: t :: m () вместо :: u :: m () , что приводит к ошибке компиляции на #2.
gcc. Что соответствует моим ожиданиям.
ошибки MSVC на обеих строках, говоря, что он не может получить доступ к частной базе `:: t` destructor и функции частного члена` :: t :: f () `.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ber-access
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»