Функция шаблона с зависимыми параметрами типа в классе шаблона - PullRequest
1 голос
/ 18 ноября 2009

Я пытался сделать эту простую вещь, и Visual Studio 2008, похоже, не нравится.

template <class CharType>
class SomeClass
{
public:
    template <class T1, class T2>
    static bool SomeOperator(const typename T1::const_iterator& p_Begin1,
                             const typename T1::const_iterator& p_End1,
                             const typename T2::const_iterator& p_Begin2,
                             const typename T2::const_iterator& p_End2)
    {
        // do some stuff..
    }
};

И назовите это примерно так:

std::wstring a;
OtherString b;
SomeClass<wchar_t>::SomeOperator(a.begin(), a.end(), b.begin(), b.end());

Я получаю ошибки компилятора, утверждающие, что он не может вывести параметры шаблона T1 и T2

error C2783: 'bool SomeClass<CharType>::SomeOperator(const T1::const_iterator &,const T1::const_iterator &,const T2::const_iterator &,const T2::const_iterator &)' : could not deduce template argument for 'T1'
error C2783: 'bool SomeClass<CharType>::SomeOperator(const T1::const_iterator &,const T1::const_iterator &,const T2::const_iterator &,const T2::const_iterator &)' : could not deduce template argument for 'T2'

Ответы [ 3 ]

3 голосов
/ 18 ноября 2009

Компилятор просто не может вывести типы из этого контекста.

Предположим, что std::wstring::const_iterator на самом деле const wchar_t*, что вероятно. В таком случае, как компилятор знает, что он должен заменить std::wstring вместо любого другого типа T, когда T::const_iterator будет const wchar_t* (возможно vector<wchar_t>)?

Невозможно точно сказать компилятору. По тем же причинам вы не можете вывести some_template<T>::type в вызовах функций.

В вашем случае, обходной путь прост. На самом деле вам не нужен тип контейнера - шаблоны на типах итераторов будут работать нормально:

template <typename I1, typename I2>
static bool SomeOperator(const I1& p_Begin1, const I1& p_End1,
                         const I2& p_Begin2, const I2& p_End2)
  { /* stuff */ }

Если вы оказались в ситуации, когда вам нужен тип контейнера, вам придется либо обойти контейнер, либо явно указать тип в вызове функции.

1 голос
/ 18 ноября 2009

Компилятор не может сделать вывод, что параметры итератора на самом деле являются внутренними определениями типов контейнеров, предоставляющих их.

Используйте Directyl двух типов итераторов:

template< typename IT1, typename IT2>
static bool SomeOperator(const IT1& p_Begin1,
                             const IT1& p_End1,
                             const IT2& p_Begin2,
                             const IT2& p_End2)
    {
        // do some stuff..
    }
0 голосов
/ 18 ноября 2009

Возможно, вам необходимо четко указать типы SomeOperator:

SomeClass<wchar_t>::SomeOperator<std::wstring, std::wstring>(a.begin(), a.end(), b.begin(), b.end());

Я знаю, что это кажется раздражающим, но на самом деле довольно сложно (а порой и невозможно) для компилятора определить тип контейнера из вложенного определения, например T::const_iterator. Переход от const_iterator к T не является простым AFAIK.

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