Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4

Ошибка: templates may not be 'virtual'

01.11.2015, 16:42. Показов 1792. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане.

Какими способами можно избежать этой ошибки?
Code
1
ошибка: templates may not be 'virtual'
C++
1
2
3
4
5
6
7
8
class IObject
{
public:
    IObject();
 
    template<class... Args>
    virtual void run(Args... args) const = 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class IOther : public IObject
{
public:
    IOther();
 
    template<class... Args>
    virtual void run(Args... args)
    {
        // other logic
    }
 
private:
    virtual void meth_other() const = 0;
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2015, 16:42
Ответы с готовыми решениями:

Protected abstract virtual base pure virtual private destructor
Хай, all) Вопрос не для начинающих и дурацкий) В разделе для экспертов публиковать не стал, чтобы не засорять его) Наткнулся тут на...

Ошибка "Could not change to the templates directory"
Could not change to the templates directory..... - ошибка. На ноуте с виндой 7 всё нормально,на 8 - я уже написал. В чём причина?

Ошибка при восстановлении бекапа на Virtual Box
Возникает такая ошибка при восстановление бекапа на Virtual Box В сети находил мануал, там нужно было реестр менять, не помогло и там...

7
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.11.2015, 16:44
Цитата Сообщение от QVO Посмотреть сообщение
Какими способами можно избежать этой ошибки?
Не делать виртуальную функцию шаблоном.
1
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
01.11.2015, 16:50  [ТС]
DrOffset, есть менее очевидные способы?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.11.2015, 16:52
Цитата Сообщение от QVO Посмотреть сообщение
есть менее очевидные способы?
Это зависит от задачи. Если рассуждать на сфероконях, то нет.
Напиши зачем тебе такое понадобилось, какую задачу решаешь - с этим уже можно работать.
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
01.11.2015, 17:00  [ТС]
DrOffset, необходим класс-интерфейс содержащий перегруженный виртуальный метод.
От этого класса наследуются дочерние с реализаций виртуального метода. Параметры могут быть разные и разное количество.
Не хочется при создании дочернего класса лезть в класс-интерфейс и заниматься перегрузкой виртуального метода.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.11.2015, 17:07
QVO, Простейший вариант:
C++
1
2
3
4
5
6
7
8
#include <vector>
#include <boost/any.hpp>
 
class IObject
{
public:
    virtual void run(std::vector<boost::any> const &) const = 0;
};
Правда обычно такое все-таки свидетельствует об ошибке в дизайне.
Точно нельзя каким-то образом обобщить аргументы, например, введя для них базовых класс? Тогда код станет проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
 
class IArgument
{
public:
    // argument interface
};
 
class IObject
{
public:
    virtual void run(std::vector<IArgument *> const &) const = 0;
};
1
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
01.11.2015, 17:17  [ТС]
DrOffset, видимо ошибка дизайна, не с кем посоветоваться.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.11.2015, 17:44
QVO, можно было бы нарисовать нечто такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <vector>
 
class IArgument
{
public:
    // argument interface
    
    virtual void print() const = 0;
};
 
class IObject
{
public:
    template <typename ...Args>
    void run(Args ...args) const
    {
        IArgument const * args_arr[] = { &args... };
        this->run_impl(args_arr, sizeof...(args));        
    }
protected:
    virtual void run_impl(IArgument const * args[], size_t size) const = 0;
};
 
 
class ObjectImpl : public IObject
{
private:
    void run_impl(IArgument const * args[], size_t size) const
    {
        for(size_t i = 0; i < size; ++i)
        {
            args[i]->print();
        }
    }
};
 
 
int main()
{
    ObjectImpl impl;
    
    IObject * ptr = &impl;
    
    struct Int : IArgument
    {
        void print() const { std::cout << "Int\n"; }
    };
    struct Float : IArgument
    {
        void print() const { std::cout << "Float\n"; }
    };
    
    ptr->run(Int(), Float());
}
http://rextester.com/KHK67984

Добавлено через 22 минуты
Можно даже как-то так (осторожно, немножко С++14):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <vector>
#include <tuple>
#include <utility>
#include <array>
 
class IArgument
{
public:
    // argument interface
    
    virtual void print() const = 0;
};
 
template <typename Arg>
class Argument 
    : public IArgument
{
public:    
    Argument(Arg const & v) : m_val(v) {}
    
    void print() const
    {
        std::cout << m_val << std::endl;
    }
    
private:
    Arg m_val;
};
 
namespace detail {
    
template <typename Tuple, size_t... Indexes>
std::array<IArgument const *, sizeof...(Indexes)> 
    to_argarray(Tuple && tuple, std::index_sequence<Indexes...>)
{
    return {{ &std::get<Indexes>(std::forward<Tuple>(tuple))... }};
}
 
template <typename Tuple>
auto to_argarray(Tuple && tuple)
{
    return to_argarray(std::forward<Tuple>(tuple)
                       , std::make_index_sequence<
                             std::tuple_size<typename std::remove_reference<Tuple>::type>::value
                         >{}
           );
}
 
} // detail
 
 
class IObject
{
public:
    template <typename ...Args>
    void run(Args ...args) const
    {
        auto args_tuple = std::make_tuple(Argument<Args>(args)...);
        auto args_arr   = detail::to_argarray(args_tuple);
        
        this->run_impl(&args_arr[0], args_arr.size());        
    }
    
protected:
    virtual void run_impl(IArgument const * args[], size_t size) const = 0;
};
 
 
class ObjectImpl : public IObject
{
private:
    void run_impl(IArgument const * args[], size_t size) const
    {
        for(size_t i = 0; i < size; ++i)
        {
            args[i]->print();
        }
    }
};
 
 
int main()
{
    ObjectImpl impl;
    
    IObject * ptr = &impl;
    
    ptr->run(1, 2.3, std::string("blah-blah"), "c_str");
}
http://rextester.com/YJK86080
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.11.2015, 17:44
Помогаю со студенческими работами здесь

Eclipse - ошибка No Java virtual machine was found
Здравствуйте. Скачал Eclipse для программирования на языке C++, у меня Win7 64 скачал, распаковал, запускать начал и выдает ошибку A...

Ошибка при установке ubuntu на Virtual Box
Устанавливаю ubuntu-12.04.3-desktop-amd64.iso на виртуальную машину на ноутбук и получаю вот такую ошибку: This kernel requires an...

Ошибка portcls.sys, не устанавливается Windows XP 2009 на VirtualBox
Мой ноут emachines e728, поставил себе v box для обучения переустановке, хотел поставить Xp на пол пути к цели, выводиться синий экран...

VMware ошибка при запуске: cannot connect to virtual machine
Добрый день, Подскажите может кто знает как устранить ошибку ? На компе нахожусь под учеткой администратора

Ошибка java.lang.NullPointerException: Attempt to invoke virtual method
Помогите, пожалуйста. Делал приложение на андроид для установки обоев и когда выбираю обои приложение выдает ошибку


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru