Заблокирован
1

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

25.05.2012, 04:54. Показов 1621. Ответов 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 минут
Если кому нибудь интересно - проблема была решена путем переустановки вижал студии.
Сами по себе оба способа корректны.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2012, 04:54
Ответы с готовыми решениями:

Явная специализация метода для типа шаблонного класса
Добрый вечер, уважаемые знатоки! :) Хочу задать вопрос по созданию шаблонов. В общем, пусть у меня...

Инициализация объекта класса объектом этого же класса
В задаче создается объект класса hoba, в который добавляются объекты базового и производного...

Использование в методе шаблонного класса сразу 2-х шаблонных параметров
Доброго времени суток форумчане! Мой вопрос находится в примере ... //##### ..... ##### //...

Возможно ли создание объекта шаблонного класса в функции этого класса?
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон...

2
В астрале
Эксперт С++
8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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>&»
1
Заблокирован
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); 
    }
Хотя с другой стороны, мало-мало напрягает, почему константный метод позволяет клонировать объект при помощи копирующего конструктора, и при этом насчет константности нигде не бурчит!

Типа, константная ссылка - это ого-го! А константный указатель - это фик с ним, так получается...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2012, 18:42
Помогаю со студенческими работами здесь

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); }...

Вызов метода у шаблонного поля, шаблонного класса
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и...

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

Чем отличается шаблонный метод класса от шаблонного класса?
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru