Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

25.05.2012, 04:54. Просмотров 1023. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2012, 04:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Клонирование объекта шаблонного класса (C++):

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

Создание объекта класса в другом классе!!! - C++
//----------------------------------Address.h---------------------------------------------------- class Address { public: const...

Специализация шаблонного класа - C++
Каким образом можно написать специализацию шаблонного класса так, чтобы часть методов являлась специализированной, то есть писалась заново,...

Выбор шаблонного варианта для аргумента-массива - C++
По стопам оффтопа в теме решил создать свою. Для ускорения прояснения ситуации, так сказать. Имеем код: #include &lt;iostream&gt; ...

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

Сортировка объекта класса TStringList - C++ Builder
Здравствуйте! Ребята, подскажите, по такому вопросу. У меня есть текст который занесен в объекта класса TStringList(). Так вот мне из этого...

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

Типа, константная ссылка - это ого-го! А константный указатель - это фик с ним, так получается...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2012, 18:42
Привет! Вот еще темы с ответами:

Создание и отрисовка объекта класса - C++ Builder
Здравствуйте! Возникла проблема при объявлении класса в С++ Builder. Помогите, если можете. Вкратце история такая: Прочитал статьи...

Создание объекта класса внутри DLL - C++ Builder
Извините, если такая тема уже была - не нашел поиском. Проблема в следующем: нужно инициализировать объект некоторого класса (класс...

Метод для произвольного объекта класса - C++ Builder
Добрый вечер! Прошу совет для решения следующей задачи: на форме динамически создаются объекты CheckBox. Как написать функцию, чтобы при...

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


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

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

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