Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Bers
Заблокирован
#1

Клонирование объекта шаблонного класса - C++

25.05.2012, 04:54. Просмотров 967. Ответов 2
Метки нет (Все метки)

Задача ниже представленного механизма - запоминать функции/методы со всеми аргументами, и производить их отложенный запуск по требованию

В ниже представленном коде нужно организовать возможность объекту откопировать себя в динамической памяти, и вернуть указатель.

Для этого использовались два подхода:
1. Копирующий конструктор (способ сработал, и проблем нет).

2. Конструктор с параметрами (способ не сработал).

Требуется: понять причину поломки во втором случае.

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
//------------------------
template<class T1, class T2=SEmpty>
class TLauncher: public ILauncher_t
{
public:
    typedef typename TMetaProgramm<T1,T2>::Strategy_t Executer_t;
    typedef typename TMetaProgramm<T1,T2>::Function_t Function_t;
    typedef typename TMetaProgramm<T1,T2>::Client_t Client_t;
    typedef typename TMetaProgramm<T1,T2>::Arg_t Arg_t;
 
    friend Executer_t;
public:
    virtual ~TLauncher() { std::cout<<"Dtor\n"; }
public:
    TLauncher(Client_t* pObj, Function_t func, Arg_t& arg)
        :mClient(pObj), mFunc(func), mArg(arg){}
 
    TLauncher(Function_t func, Arg_t& arg)
        :mClient(0l), mFunc(func), mArg(arg){}
public:
    virtual float Execute(const float seconds) { return Executer_t::Execute(*this); }
 
    virtual ILauncher_t* Copy()const      
    {
          //return new TLauncher(*this); //с этим методом все в порядке
        
          //: error C2143: синтаксическая ошибка: отсутствие ";" перед "template"
          return new TLauncher(mClient,mFunc,mArg); 
    }
    
    virtual bool IsFinished(void) const        { return true; }
    virtual void Accept(Commands::Core::Inspector& inspector){}
protected:
    Client_t* mClient;
    Function_t mFunc;
    Arg_t mArg;
};
Кто нибудь знает, из-за чего это может быть?

Добавлено через 19 минут
На всякий случай привожу полный текст ошибки:

1>d:\1command3\1command3\execute.h(163) : error C2143: синтаксическая ошибка: отсутствие ";" перед "template"
1>d:\1command3\1command3\bazisconsole.cpp(82) : fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка '{' в "d:\1command3\1command3\execute.h(16)"

Добавлено через 8 часов 11 минут
Если кому нибудь интересно - проблема была решена путем переустановки вижал студии.
Сами по себе оба способа корректны.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2012, 04:54     Клонирование объекта шаблонного класса
Посмотрите здесь:

C++ Обявление шаблонного класса
C++ указатель на экземпляр шаблонного класса
Объявление шаблонного класса C++
C++ Создание Шаблонного класса
C++ Инстанцирование шаблонного класса
C++ Перегрузка оператора << шаблонного класса
Вызов метода у шаблонного поля, шаблонного класса C++
Реализация шаблонного класса C++
Возможно ли создать шаблонный объект шаблонного объекта? C++
Как произвести клонирование объекта со всеми его компонентами? C++
Специализация шаблонного класса C++
C++ Чем отличается шаблонный метод класса от шаблонного класса?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.05.2012, 12:07     Клонирование объекта шаблонного класса #2
Bers, Я вот че-то нифига корректного здесь не наблюдаю.

C++
1
2
3
4
5
6
7
    virtual ILauncher_t* Copy()const      
    {
          //return new TLauncher(*this); //с этим методом все в порядке
        
          //: error C2143: синтаксическая ошибка: отсутствие ";" перед "template"
          return new TLauncher(mClient,mFunc,mArg); 
    }
Функция константная.
C++
1
2
    TLauncher(Client_t* pObj, Function_t func, Arg_t& arg)
        :mClient(pObj), mFunc(func), mArg(arg){}
Принимает параметр по не const ссылке. Где здесь корректность собственно?

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<class T>
class Some
{
public:
   Some(T& val):value(val)
   {
   }
   Some* Copy() const
   {
      return new Some(value);
   }
private:
   T value;
};
 
int main()
{
   int value = 10;
   Some<int> s(value);
   Some<int>* res = s.Copy();
   delete res;
}
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp
new.cpp: В функции-члене «Some<T>* Some<T>::Copy() const [with T = int, Some<T> = Some<int>]»:
new.cpp:27:28: instantiated from here
new.cpp:17:28: ошибка: нет подходящей функции для вызова «Some<int>::Some(const int&)»
new.cpp:17:28: замечание: candidates are:
new.cpp:12:4: замечание: Some<T>::Some(T&) [with T = int]
new.cpp:12:4: замечание: no known conversion for argument 1 from «const int» to «int&»
new.cpp:9:7: замечание: Some<int>::Some(const Some<int>&)
new.cpp:9:7: замечание: no known conversion for argument 1 from «const int» to «const Some<int>&»
Bers
Заблокирован
25.05.2012, 18:42  [ТС]     Клонирование объекта шаблонного класса #3
Насчет константности - это верное замечание.

Реальный код в данный момент выглядит вот так:

C++
1
2
3
4
5
6
7
virtual ILauncher_t* Copy()const      
    {
        //return new TLauncher(*this); 
 
        Arg_t& src = const_cast<Arg_t&>(mArg);
        return new TLauncher(mClient,mFunc,src); 
    }
Хотя с другой стороны, мало-мало напрягает, почему константный метод позволяет клонировать объект при помощи копирующего конструктора, и при этом насчет константности нигде не бурчит!

Типа, константная ссылка - это ого-го! А константный указатель - это фик с ним, так получается...
Yandex
Объявления
25.05.2012, 18:42     Клонирование объекта шаблонного класса
Ответ Создать тему
Опции темы

Текущее время: 20:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru