Nano Hash - криптовалюты, майнинг, программирование

Ввод типа шаблона, используемый в качестве типа шаблона для свойства члена C++

Итак, я пытаюсь, чтобы один класс шаблона был контейнером (который позже будет работать) набором содержащихся классов, также сгенерированных из шаблона и сохраненных в векторе.

Абстрактная форма того, что я пытаюсь сделать, будет выглядеть так:

template <typename T, size_t numberofapples> 
class Apples {

    public:
        Apples(std::vector<T> appleinfo1, std::vector<T> appleinfo2);

    protected:
        std::vector<T> apple_stats;
        std::vector<T> info1, info2;


};

template <typename T, size_t numberofapples> 
Apples<T, numberofapples>::Apples(std::vector<T> appleinfo1, std::vector<T> appleinfo2) : apple_stats(numberofapples, 0){
    for (size_t i = 0; i < numberofapples; ++i) {
        apple_stats[i] = rand();
    }

    info1 = appleinfo1;
    info2 = appleinfo2;


}



template <typename T, typename FruitType, size_t numberoffruitperbranch> 
class Tree {

    public:
        Tree(size_t numberofbranches, std::vector<T> commonfruitinfo1, std::vector<T> commonfruitinfo2);

    protected:
        std::vector<FruitType<T, numberoffruitperbranch> > branchset;

};      

template <typename T, typename FruitType,  size_t numberoffruitperbranch>
Tree<T, FruitType, numberoffruitperbranch>::Tree(size_t numberofbranches, std::vector<T> commonfruitinfo1, std::vector<T> commonfruitinfo2) :  {

    typename FruitType<T, numberoffruitperbranch> single_fruit(fruitinfo1, fruitinfo2); 

    branchset.resize(numberofbranches, single_fruit);
    //in the un-abstracted version that has nothing to do with fruit, I'd then iterate over the vector and run some internal code on each one
}

Цель состоит в том, что я хотел бы сделать что-то вроде:

Tree<double, Apples, 10> MyFirstTree(5, vectorofdata, secondvectorofdata);

Однако на данный момент компилятор сообщает мне, что FruitType не является допустимым шаблоном внутри функции-конструктора. На самом деле все внутри конструктора выходит за рамки и помечается, но я не могу понять, почему. Неабстрагированная версия также имеет ряд других переменных-членов и функций, но проблема определенно заключается в конструкторе контейнера внешнего класса.

Где я ошибаюсь/как это можно сделать лучше?

редактировать: исправлены некоторые ошибки компилятора (я думаю), которые, как я заметил, отличались от этого тривиального примера, который я не делал в реальном приложении

23.09.2011

  • Этот код изобилует ошибками компилятора. Я могу только предположить из typename FruitType<T, numberoffruitperbranch> и std::vector<FruitType> branchset;, что вы пытаетесь использовать один и тот же параметр в качестве типа (например, Apples<double, 5>) и в качестве шаблона (только Apples). Вам нужно принять решение. 24.09.2011
  • Я не слежу за тобой, и, наверное, в этом проблема. В конечном итоге у меня есть 2 класса: «Яблоки» и «Дерево». Яблоки содержат тип (в этом примере double), а дерево в конечном итоге должно содержать яблоки (в этом примере double). Во всех случаях яблоки должны быть типом, сгенерированным из шаблона. Разве это невозможно? Должен ли вектор быть чем-то вроде std::vector‹FruitType‹T, numberoffruitperbranch› › ? 24.09.2011
  • В дополнение к комментариям @UncleBens - class не Class в c++, std::vector, а не std:vector, заканчивайте занятия с };, а не }, возможно, есть еще... 24.09.2011
  • Это тривиальные опечатки компилятора, которые я сделал при создании абстрактного примера выше. Я просмотрел его и исправил указанные, а затем проверил свой фактический код; у него не было ни одной из проблем, найденных здесь. 24.09.2011

Ответы:


1

Как упоминалось в @MSN, вам нужно использовать вложенные шаблоны. В вашем случае они принимают вид:

template<typename T, size_t nr, template <typename, size_t> class FruitType>
class Tree { ... };

И используются они так:

Tree<double, 20, Apple> someTree;

Реальный пример из предоставленного вами кода (компилируется под VC++ 2010):

#include <iostream>
#include <vector>

template <typename T, size_t numberofapples> 
class Apples {

    public:
        Apples(std::vector<T> appleinfo1, std::vector<T> appleinfo2);

    protected:
        std::vector<T> apple_stats;
        std::vector<T> info1, info2;


};

template <typename T, size_t numberofapples> 
Apples<T, numberofapples>::Apples(std::vector<T> appleinfo1, std::vector<T> appleinfo2) : apple_stats(numberofapples, 0){
    for (size_t i = 0; i < numberofapples; ++i) {
        apple_stats[i] = rand();
    }

    info1 = appleinfo1;
    info2 = appleinfo2;


}



template <typename T, size_t numberoffruitperbranch, template <typename, size_t> class FruitType> 
class Tree {

    public:
        Tree(size_t numberofbranches, std::vector<T> commonfruitinfo1, std::vector<T> commonfruitinfo2);

    protected:
        std::vector<FruitType<T, numberoffruitperbranch> > branchset;

};      

template <typename T, size_t numberoffruitperbranch, template <typename,  size_t> class FruitType>
Tree<T, numberoffruitperbranch, FruitType>::Tree(size_t numberofbranches, std::vector<T> commonfruitinfo1, std::vector<T> commonfruitinfo2) {

    typename FruitType<T, numberoffruitperbranch> single_fruit(commonfruitinfo1, commonfruitinfo2); 

    branchset.resize(numberofbranches, single_fruit);
    //in the un-abstracted version that has nothing to do with fruit, I'd then iterate over the vector and run some internal code on each one
};

int main()
{
    Tree<double, 10, Apples> someTree(20, std::vector<double>(), std::vector<double>());
    return 0;
}
23.09.2011

2

Вы хотите объявить FruitType как параметр шаблона:

template<..., template <typename, size_t> typename FruitType, ...>
23.09.2011
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..