Ошибка аргументов шаблона, C ++ - PullRequest
1 голос
/ 30 января 2011

Я использую довольно сложную структуру данных:

класс 1:

template <class T>
class Number
{
private:
            T first;
            T second;

};

класс 2:

template <typename Item>
struct TList
{
    typedef std::vector <Item> Type;
};

template <typename Item>
class GList
{
private:
            typename TList <Item>::Type items;

public:
            GList() : items (0) {}


public:
            Item & operator [] (int index ) {return items[index];}
};

класс 3:

template <typename T, template <typename> class GList>
class sortIndices 
{

private:
    const GList <T> *l;

public:
    sortIndices ( const GList <T> *l_ ) : l ( l_ ) {}

    bool operator() ( const unsigned int &i_p1, const unsigned int &i_p2 ) const
    {
        return true;
    }

};

класс 4:

template <typename T, template <typename> class List>
struct TISet
{
    typedef std::set <unsigned int, sortIndices <T, List> >  Type;
};


template <typename T, template <typename> class List>
struct TSample
{
    T res;
    typename TISet <T, List> ::Type indices;
    TSample ( const List <T> *nl ) : res(0), indices ( nl ) {}
};

класс 5:

template <typename T, template <typename> class List>
struct TResults
{
    typedef std::set < TSample <T, List>, sortIndices <T, List> > Type;
};

класс 6:

class Test
{
public:
    template <typename T, template <typename> class List>
    static void function (List <T> *l, typename TResults <T, List> ::Type *result) {}
};

Проблемы с использованием следующего объекта в качестве аргумента статической функции ...

TResults <double, GList >::Type t_results; 

Мой первый вопрос: как правильно передать адрес структуры TResults?

Основная программа:

int main() 
{
    GList <Number <double> *> plist; //Create list of numbers
    TResults <double, GList >::Type t_results; //Create empty results

    Test::function(&plist, &t_results); //ERROR, test function
}

Код ошибки:

Error   1 error C2664: 'void Test::function< Number <T> *, GList>( GList <Item> *,std::set<_Kty, _Pr> *)' :
cannot convert parameter 2 from 'std::set<_Kty,_Pr> *' to 'std::set<_Kty,_Pr> *'

with
      [
          T=double,
          Item=Number<double> *,
          _Kty=TSample<Number<double> *,GList>,
          _Pr=sortIndices<Number<double> *,GList>
      ]
      and
      [
          _Kty=TSample<double,GList>,
          _Pr=sortIndices<double,GList>
      ]
      and
      [
          _Kty=TSample<Number<double> *,GList>,
          _Pr=sortIndices<Number<double> *,GList>
      ]

После модификации

class Test
{
public:
    template <typename T, template <typename> class List>
    static void function (typename TResults <T, List> ::Type *result) {}
};

int main() 
{
    GList <Number <double> *> plist; //Create list of numbers
    TResults <double, GList >::Type t_results; //Create empty results

    Test::function(&t_results); //ERROR, test function
}

Произошла следующая ошибка:

Ошибка 1 Ошибка C2783: «void Test :: function (TResults :: Type *)»: не удалось вывести аргумент шаблона для «T»

Спасибо за ваше время и помощь ...

Ответы [ 2 ]

1 голос
/ 31 января 2011

Проверка http://www.ideone.com/tTETR

Я изменил типы и добавил параметр компаратора в TResults::Type ctor.

1 голос
/ 30 января 2011

Нет соответствующей специализации.Вы можете вызвать

Test::function( GList<Number<double>*>*, TResults<Number<double>*, GList>::Type* );

или

Test::function( GList<double>*, TResults<double, GList>::Type* );

, но типы аргументов, которые у вас есть, не объединяются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...