ошибка возвращая станд.:: набор <T>:: итератор в шаблоне

Предположение, что Вы используете MicrosoftMvcAjax, Вы могли передать обратно JavascriptResult, который предупреждает пользователя, что они достигли конца ползунка. Если ответом является JavaScript, а не содержание, обработчик MicrosoftMvcAjax выполняет его вместо того, чтобы заменить содержание DOM.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetNextImage(...)
{
    if(Request.IsAjaxRequest())
    {
        if(CURRENT_IMAGE != LAST_IMAGE)
        {
            Image image = GetNextImage(...);
            var partialViewResult = new PartialViewResult();
            partialViewResult.ViewName = "ImageSlide";
            partialViewResult.ViewData.Model = image;
            return partialViewResult;
        }
        else
        {
            return JavaScript( "alert('No more images');" );
        }
    }

    return RedirectToAction("Error", "Home");
}

, Конечно, Вы, вероятно, хотели бы быть более творческими и использовать диалоговый плагин jQuery или что-то, а не предупреждение.

5
задан jackhab 13 October 2009 в 17:35
поделиться

1 ответ

Попробуйте typename :

template <class T>
class CSafeSet
{
    public:
        CSafeSet();
        ~CSafeSet();

        typename std::set<T>::iterator Begin();

    private:
        std::set<T> _Set;
};

Там вам нужно typename, потому что оно зависит от шаблона T. Более подробная информация по ссылке над кодом. Многие из этих вещей упрощаются, если вы используете typedef:

template <class T>
class CSafeSet
{
    public:
        typedef T value_type;
        typedef std::set<value_type> container_type;
        typedef typename container_type::iterator iterator_type;
        typedef typename container_type::const_iterator const_iterator_type;

        CSafeSet();
        ~CSafeSet();

        iterator_type Begin();

    private:
        container_type _Set;
};

Кстати, если вы хотите быть полным, вам нужно разрешить CSafeSet делать то же самое, что и набор , что означает использование пользовательский компаратор и распределитель:

template <class T, class Compare = std::less<T>, class Allocator = std::allocator<T> >
class CSafeSet
{
    public:
        typedef T value_type;
        typedef Compare compare_type;
        typedef Allocator allocator_type;

        typedef std::set<value_type, compare_type, allocator_type> container_type;
        typedef typename container_type::iterator iterator_type;
        typedef typename container_type::const_iterator const_iterator_type;

        // ...
}

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

17
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: