Специализация шаблона по классу, который сам является шаблоном [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Специализация шаблона по классу, который сам является шаблоном [закрыто]

Сообщение Anonymous »

У меня возникла проблема с использованием параметров шаблона.
Я определил класс MCFLemonSolver в файле MCFLemonSolver.h. Вот определение:

Код: Выделить всё

 template< template< typename , typename , typename > typename Algo ,
typename GR , typename V , typename C >

requires LEMONGraph< GR >
class MCFLemonSolver : public CDASolver, Fields< Algo >
И у меня есть метод, объявленный в этом классе:

Код: Выделить всё

int compute( bool changedvars = true ) override;
Наследуется от класса, дочерним элементом которого является MCFLemonSolver.
В MCFLemonSolver есть определение этого метода это работает правильно, но я хочу переместить его из .h в файл .cpp и специализировать метод для каждого алгоритма, который есть в моем проекте, но есть проблема. может представлять собой четыре различных алгоритма, используемых классом MCFLemonSolver для решения задач минимальной стоимости потока. Поскольку алгоритм может быть определен четырьмя разными способами, я хочу специализировать метод Compute() для каждого алгоритма, поэтому я определяю метод Compute() в файле .cpp файл:

Код: Выделить всё

template
template
template
int MCFLemonSolver< AlgoType::Algo_GRVC, GR, V, C >::compute( bool changedvars )
Я решил использовать директиву using для определения AlgoType внутри класса MCFLemonSolver в .h для одной специализации с NetworkSimplex< /code> Алгоритм.:

Код: Выделить всё

struct AlgoType {
using Algo_GRVC = NetworkSimplex;
};
Когда я пытаюсь скомпилировать с помощью clang, я получаю эту ошибку в определении специализированного метода Compute() в MCFLemonSolver.cpp< /code>:

ошибка: использование необъявленного идентификатора AlgoType

Кажется, область действия класса MCFLemonSolver недоступна.
Я определил пространство имен SMSpp_di_unipi_it в начале MCFLemonSolver.h, которое обертывает создайте весь файл и используйте оператор **using** SMSpp_di_unipi_i в начале файла .cpp.
Определение использования для каждой комбинации параметров шаблона — худший способ сделать это, поскольку мне нужно определить 16 различных сигнатур Compute() для каждой комбинации, иначе я могу определить метод Compute() в классе и я почти уверен, что это сработает.
Пример

Код: Выделить всё

#include
using namespace std;
//I have a class M that depends on a template class A

template< template< typename > class A, typename C>
class M{
virtual int foo(bool){}
};

//Then i have a specific class

template< typename C >
class MyA;

template< typename C >
class MyA{
public:

C value(){}
};

//Now i want to specialize on A, but none on C.
//Hence
template
class M{
public:
int foo(bool b){return true;}
};

int main()
{

M m;
cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78520044/template-specialisation-over-a-class-that-is-itself-template[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»