Браузеры могут блокировать доступ к window.top
из-за та же политика источника . Ошибки IE также происходят. Вот рабочий код:
function inIframe () {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
top
и self
оба window
объекты (наряду с parent
), таким образом, Вы видите, является ли Ваше окно главным окном.
Вам необходимо указать T
.
int i = c.operator()<int>();
К сожалению, вы не можете использовать синтаксис вызова функции напрямую в этом случае.
Изменить: О, и вы отсутствует public:
в начале определения класса.
Вы в основном правы. Допускается определение шаблонных операторов, но они не могут быть вызваны напрямую с явными аргументами шаблона.
Если у вас есть этот оператор:
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
вместо использования оператора.
Вы не думаете о
class Foo {
public:
template<typename T>
operator T() const { return T(42); }
};
Foo foo;
int i = (int) foo; // less evil: static_cast<int>(foo);
живом примере ? Это доказывает, что вам не нужно указывать аргумент шаблона, несмотря на утверждение в принятом ответе.