странная проблема с шаблоном - PullRequest
0 голосов
/ 20 января 2011

У меня определена следующая функция:

template<class KEY, class VALUE, class HASH_FUNCTION, 
         class COMPARATOR_FUNCTION, class GREATER_THAN_FUNCTION>
bool Test3(size_t szCount, double dLoadFactor, vector<KEY>& vVals, 
           const HASH_FUNCTION& hf, const COMPARATOR_FUNCTION& cf, 
           const GREATER_THAN_FUNCTION& gf)

Затем я вызываю ее main().

int main()
{
    vector<char*> vVals = GetWords("enwik8", 128*1024*1024);
    SHash sh;
    SHComp cf;
    SHGreater gf;
    Test3(1000, 0.7f, vVals, sh, cf, gf);

    return 0;
}

И я получаю эту ошибку:

/home/duminda/main.cpp:313: error: no matching function for call to 
    ‘Test3(int, float, std::vector<char*, std::allocator<char*> >&, SHash&, 
    SHComp&, SHGreater&)’

Возможно, я упускаю что-то очевидное.Любая помощь будет оценена.Спасибо.

Ответы [ 3 ]

3 голосов
/ 20 января 2011

Глядя на объявление функции, он имеет параметр шаблона V, который нигде не используется в фактическом списке параметров. Поэтому он не может быть автоматически выведен на сайт вызова.

Попробуйте просто определить это так:

template<class K class HF, class CF, class GF>
bool Test3(size_t szCount, double dLoadFactor, vector<K>& vVals, const HF& hf, const CF& cf, const GF& gf)

Кстати, вы можете подумать о том, чтобы потратить 5 секунд на поиск значимых имен. Если бы у V было разумное имя, было бы более очевидно, что оно не имеет смысла.

2 голосов
/ 20 января 2011

Существует параметр шаблона VALUE, который не был разрешен. Он никогда не используется.

Ваша функция уже должна иметь возможность получать этот тип, если она использует его где-то в теле. Если он получен из другого параметра шаблона, убедитесь, что у вас есть способ сделать это. Возможно, этот параметр шаблона имеет внутреннюю typedef, например, если одна из ваших функций сравнения сравнивает значения этого типа, они могут иметь value_type typedef.

Обязательно используйте typename в теле, чтобы добраться до этого типа, если это сделано таким образом.

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

С учетом отредактированной декларации

template<class KEY, class VALUE, class HASH_FUNCTION,
         class COMPARATOR_FUNCTION, class GREATER_THAN_FUNCTION>
bool Test3(size_t szCount, double dLoadFactor, vector<KEY>& vVals,
           const HASH_FUNCTION& hf, const COMPARATOR_FUNCTION& cf,
           const GREATER_THAN_FUNCTION& gf);

и комментарий: V используется функцией Test3. Могу ли я сказать компилятору тип V?

Проблема с Test3(1000, 0.7f, vVals, sh, cf, gf); заключается в том, что компилятор не может определить аргумент шаблона VALUE. Но вы можете явно перечислить аргументы шаблона для имени функции следующим образом:

Test3<const char*, value_type>(1000, 0.7f, vVals, sh, cf, gf);

Здесь первые два аргумента шаблона KEY = const char* и VALUE = value_type приведены в < угловых скобках >, а остальные могут быть получены компилятором.

Если вы измените порядок KEY и VALUE в объявлении шаблона, вы можете пропустить указание KEY и сделать вывод:

template<class VALUE, class KEY, class HASH_FUNCTION,
         class COMPARATOR_FUNCTION, class GREATER_THAN_FUNCTION>
bool Test3(size_t szCount, double dLoadFactor, vector<KEY>& vVals,
           const HASH_FUNCTION& hf, const COMPARATOR_FUNCTION& cf,
           const GREATER_THAN_FUNCTION& gf);

// ...

Test3<value_type>(1000, 0.7f, vVals, sh, cf, gf);
...