Действительно ли создание является специализацией шаблона функции, виртуальной законный?

Шаг 1. Подключение к Azure через Powershell

MSOnline устарела :

Теперь я установил Install-Module AzureAD

Вход в систему работает нормально.

11
задан Peter Mortensen 5 July 2016 в 08:17
поделиться

2 ответа

Хорошая ошибка компилятора. Для этого типа проверок я всегда возвращаюсь к компилятору Comeau , прежде чем вернуться к стандарту и проверке.

Comeau C / C ++ 4.3.10.1 (6 октября 2008 г.) 11:28:09) для ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. Все права защищены. MODE: строгий ошибки C ++ C ++ 0x_extensions

«ComeauTest.c», строка 3: ошибка: «виртуальный» не допускается в функции шаблон декларация шаблон виртуальной пустоты f (); ^

"ComeauTest.c", строка 10: ошибка: «виртуальный» не допускается в функции шаблон декларация шаблон виртуальной пустоты f (); ^

Теперь, поскольку это было опубликовано другим пользователем, факт в том, что стандарт не позволяет вам определять виртуальные шаблонные методы. Обоснование заключается в том, что для всех виртуальных методов запись должна быть зарезервирована в виртуальной таблице. Проблема в том, что методы шаблона будут определены только тогда, когда они были созданы (использованы). Это означает, что vtable будет иметь разное количество элементов в каждом модуле компиляции, в зависимости от того, сколько разных вызовов в f () происходит с разными типами. Тогда ад поднимется ...

Если вам нужна шаблонная функция для одного из ее аргументов, а одна конкретная версия является виртуальной (обратите внимание на часть аргумента), вы можете сделать это:

class Base
{
public:
   template <typename T> void f( T a ) {}
   virtual void f( int a ) { std::cout << "base" << std::endl; }
};
class Derived : public Base
{
public:
   virtual void f( int a ) { std::cout << "derived" << std::endl; }
};
int main()
{
   Derived d;
   Base& b = d;
   b.f( 5 ); // The compiler will prefer the non-templated method and print "derived"
}

Если вы хотите это обобщается на любой тип, значит вам не повезло. Рассмотрим другой тип делегирования вместо полиморфизма (агрегация + делегирование могут быть решением). Дополнительная информация о рассматриваемой проблеме поможет найти решение.

20
ответ дан 3 December 2019 в 04:14
поделиться

Согласно http://www.kuzbass.ru:8086/docs/isocpp/template.html ИСО / МЭК 14882: 1998:

-3- Шаблон функции-члена не должен быть виртуальным.

Пример:

template <class T> struct AA {
    template <class C> virtual void g(C);   //  Error
    virtual void f();                       //  OK
};
4
ответ дан 3 December 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: