63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
1

Не могу разделить template метод в .h и .cpp файлы

09.08.2016, 19:19. Показов 5206. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Писал для проверки мини прогу, там все работает:

class.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once 
#include <Windows.h>
 
class Class
{
public:
    static void getSmth();
    /* Parameters: timeout, pointer to function, arguments list */
    template <typename ... Args>
    static bool smartWaiter(DWORD timeout, bool(*func)(Args ...), Args ... args);
 
};
class.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "class.h"
 
void Class::getSmth()
{
 
}
 
/* Parameters: timeout, pointer to function, arguments list */
template <typename ... Args>
bool Class::smartWaiter(DWORD timeout, bool(*func)(Args ...), Args ... args)
{
    DWORD start = ::GetTickCount();
    bool result = func(args ...);
    while (!result && ::GetTickCount() - start < timeout)
        result = func(args ...);
 
    return result;
}
main.cpp
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
/* Some sample of smart waiter... */
 
#include "class.h"
#include "class.cpp"
 
#include <Windows.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
 
bool someFunc(int a, const char* str, char* x)
{
    // some operations which depend on time/state
    return true;
}
 
int main()
{
    const DWORD DEFAULT_TIMEOUT = 1000;
 
    bool result;
    std::vector<bool> results;
 
    result = Class::smartWaiter <int, const char*, char*> (DEFAULT_TIMEOUT, someFunc, 1, "Yeap", "x");
    results.push_back(result);
 
    std::copy(results.begin(), results.end(), std::ostream_iterator<bool>(std::cout, " \n"));
 
    system("pause");
}
Вставил в проект, не работает

header:
C++
1
2
3
4
5
6
7
    static void DisconnectElevationUtility();
    
    static void WriteLogGen(PCWSTR pszMessage, WORD wType, PWSTR FunctionName, PWSTR file);
    
    /* Parameters: timeout, pointer to function, arguments list */
    template <typename ... Args> 
    static bool smartWaiter(DWORD timeout, bool(*func)(Args ...), Args ... args);
cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
/* Parameters: timeout, pointer to function, arguments list */
template <typename ... Args>
bool EUCommon::smartWaiter(DWORD timeout, bool(*func)(Args ...), Args ... args)
{
    DWORD start = ::GetTickCount();
    bool result = func(args ...);
    while (!result && ::GetTickCount() - start < timeout)
        result = func(args ...);
 
    return result;
}
Ошибка: syntax error missing ',' before '...'

Что за фигня?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2016, 19:19
Ответы с готовыми решениями:

template .h .cpp
Здраствуйте! Возник вопрос по поводу шаблонов. В книге лафоре написана очередь Queue с...

Как правильно сократить объявление template в cpp файле
Добрый вечер! Вообщем есть следующий код: //файл .h template &lt;typename T&gt; class Test {...

Не получается разделить на .h и .cpp
.h class Banner { private: string bannerName; // нименование баннера int numbersShow; ...

Не могу исправить ошибку :113 H:\Dev-Cpp\Проекты\уроки\Безымянный3.cpp cannot convert `IDirectDraw7**' to `IDirectDraw**' for argument `2' to `HRESULT DirectDrawCreate(GUID*, IDirectDraw**, IUnknown*)
Недавно начал изучать оконные программы и работу с DirectX. Но при написании программы столкнулся...

8
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
09.08.2016, 19:50 2
Описание ошибки радует =) Поподробнее где вышла? Какая строчка? Проект нам самим собирать?
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
09.08.2016, 20:58 3
я так понимаю вы пытаетесь создать функцию, которая принимает переменное количество параметров
и вы где-то не поставили запятую, предположительно тут:
Цитата Сообщение от maxm Посмотреть сообщение
func(args ...)
Добавлено через 35 секунд
Цитата Сообщение от maxm Посмотреть сообщение
syntax error missing ',' before '...'
означает, что перед ... отсутствует ,
предлагаю вам перебрать, перед каким ...

Добавлено через 21 секунду
но программа от этого не заработает
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.08.2016, 20:59 4
maxm, никак. Это слабое место компиляторов в 21 веке
1
Эксперт С++
8725 / 4305 / 958
Регистрация: 15.11.2014
Сообщений: 9,752
09.08.2016, 22:28 5
Цитата Сообщение от maxm Посмотреть сообщение
Что за фигня?
жизнь - боль и унижение.
добро пожаловать в реальный мир.

Кликните здесь для просмотра всего текста
шаблонно-код не разделяется на h/cpp.
технология настолько сложная,
что мейнстрим тупо не осилил.
2
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
10.08.2016, 10:52 6
http://stackoverflow.com/quest... a-cpp-file
https://isocpp.org/wiki/faq/templates
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
10.08.2016, 11:30  [ТС] 7
Цитата Сообщение от Ника)) Посмотреть сообщение
Проект нам самим собирать?
Вряд ли Вы соберете столь большой обьем кода с тучей авторских либ, которые я и так не имею права распространять

Цитата Сообщение от Krock21rus Посмотреть сообщение
означает, что перед ... отсутствует ,
Я как бы понимаю английский, спасибо.

Цитата Сообщение от Krock21rus Посмотреть сообщение
http://stackoverflow.com/questions/1...-in-a-cpp-file
Вот если так посмотреть, то там он еще специализирует шаблоны, стараясь это обойти. Но тут это будет не вариант.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
maxm, никак. Это слабое место компиляторов в 21 веке
Но почему тогда мой proof-of-concept на три файла компилится и работает успешно?

Добавлено через 5 минут
Даже если определить шаблон в .h файле, будет та же ошибка. Беда в том, что либа будет прикручена к проекту с конфигом Visual Studio 2010 (v100). Если поставить Visual Studio 2015 (v140), все летает и в одном файле, и если разделить. Вот такая фигня будет.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
maxm, никак. Это слабое место компиляторов в 21 веке
Так что тут вы не правы пожалуй. VS 2015 компилит, и работает.
0
17419 / 9252 / 2263
Регистрация: 30.01.2014
Сообщений: 16,199
10.08.2016, 12:02 8
Цитата Сообщение от maxm Посмотреть сообщение
Visual Studio 2010 (v100)
Так в 2010 студии variadic templates не поддерживаются.

Цитата Сообщение от maxm Посмотреть сообщение
все летает и в одном файле, и если разделить.
Ну естественно оно там летает, т.к. ты инклудишь cpp с реализацией. Коль хочешь так разделить, то файлик с реализацией назови каким-нибудь расширением *.inl или *.tcc и включай его.

Добавлено через 1 минуту
Причина того, что шаблон при разделении "не работает" не в самом разделении, а в том, как оно начинает влиять на код при появлении нескольких единиц трансляции, в которых не хватает определения шаблона. Если отделенное определение всегда включать довеском в этот же заголовочный файл, то такая ситуация не произойдет просто напросто. Только это не должен быть файл cpp, т.к. он обычно используется как компилируемая единица, что внесет путаницу и чревато ошибками в будущем.
4
1180 / 893 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
10.08.2016, 12:09 9
Причем включать лучше в сам заголовок, в конце файла, а не в каждой единице трансляции включать заголовок+реализацию.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
#include "class.h"
 
#include <Windows.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
...
.h:
C++
1
2
3
4
5
6
7
8
9
   static void DisconnectElevationUtility();
    
    static void WriteLogGen(PCWSTR pszMessage, WORD wType, PWSTR FunctionName, PWSTR file);
    
    /* Parameters: timeout, pointer to function, arguments list */
    template <typename ... Args> 
    static bool smartWaiter(DWORD timeout, bool(*func)(Args ...), Args ... args);
 
#include "class.inl"
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2016, 12:09
Помогаю со студенческими работами здесь

Заголовочные файлы и файлы cpp
Со временем сложилось представление что при написании программ стоит разделять МЕТА данные и...

Метод класса возвращает template type
надо создать метод который возвращает значение privat переменных разных типов. например я...


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

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

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