Шаблон функции с оператором

Браузеры могут блокировать доступ к window.top из-за та же политика источника . Ошибки IE также происходят. Вот рабочий код:

function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

top и self оба window объекты (наряду с parent), таким образом, Вы видите, является ли Ваше окно главным окном.

31
задан Lightness Races with Monica 2 February 2012 в 16:30
поделиться

3 ответа

Вам необходимо указать T .

int i = c.operator()<int>();

К сожалению, вы не можете использовать синтаксис вызова функции напрямую в этом случае.

Изменить: О, и вы отсутствует public: в начале определения класса.

45
ответ дан 27 November 2019 в 22:00
поделиться

Вы в основном правы. Допускается определение шаблонных операторов, но они не могут быть вызваны напрямую с явными аргументами шаблона.

Если у вас есть этот оператор:

template <typename T>
T operator()();

, как в вашем примере, его можно вызвать только так:

int i = c.operator()<int>();

Of конечно, если бы аргумент шаблона можно было вывести из аргументов, вы все равно могли бы назвать его обычным способом:

template <typename T>
T operator()(T value);

c(42); // would call operator()<int>

Альтернативой может быть создание аргумента ссылкой и сохранение вывода там вместо его возврата:

template <typename T>
void operator()(T& value);

Поэтому вместо этого:

int r = c.operator()<int>();

вы могли бы сделать

int r;
c(r);

Или, возможно, вам следует просто определить простую функцию get () вместо использования оператора.

18
ответ дан 27 November 2019 в 22:00
поделиться

Вы не думаете о

class Foo {
    public:
    template<typename T>
    operator T() const { return T(42); }
};

Foo foo;

int i = (int) foo; // less evil: static_cast<int>(foo);

живом примере ? Это доказывает, что вам не нужно указывать аргумент шаблона, несмотря на утверждение в принятом ответе.

4
ответ дан 27 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

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