При запуске java
с опцией -cp
, как описано в Windows PowerShell, вы можете получить ошибку, которая выглядит примерно так:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Чтобы PowerShell принял команду, аргументы опции -cp
должны содержаться в кавычках, как в:
java -cp 'someDependency.jar;.' ClassName
Формирование команды таким образом должно позволить Java обрабатывать аргументы classpath правильно.
Функции оператора-кандидата, которые представляют встроенные операторы, определенные в разделе 5, указаны в этом подпункте. Эти кандидатские функции участвуют в процессе разрешения перегрузки оператора, как описано в 13.3.1.2, и используются для других целей.
blockquote> Встроенные операторы (для встроенные типы) не являются реальными функциями оператора . Поэтому у вас не может быть указателя на функцию, указывающего на них. Вы также не можете вызывать их с помощью синтаксиса operator<(A,B)
. Они участвуют только в разрешении перегрузки, но компилятор переводит их непосредственно в соответствующую инструкцию asm / machine без какого-либо «вызова функции».
user1034749 уже ответил на этот вопрос, но для полноты:
Стандарт определяет множество функциональных объектов в §20.8, [function.objects] , т. е.
Функциональный объект является объектом типа объекта функции. В тех местах, где можно было бы ожидать перехода указателя на функцию к алгоритмическому шаблону (раздел 25), интерфейс указан для принятия объекта функции. Это не только позволяет алгоритмическим шаблонам работать с указателями на функции, но также позволяет им работать с произвольными объектами функции.
blockquote>C ++ 11, §20.8.5, [сравнения]
blockquote>
- equal_to
- not_equal_to
- больше, меньше
- more_equal
- less_equal
Это те шаблонные функциональные объекты, которые распадаются на аналогичный оператор в их функции
operator()
. Они могут использоваться как аргументы указателя функции.user1034749 прав, я хочу сказать: другого пути нет, они полностью эквивалентны использованию «сырыми» указателями на функции. Ссылка [. G25]
Операторы типа стандартного класса
Вы можете использовать стандартные библиотечные операторы в качестве указателей функций (которые присутствуют как «реальные функции»).
Но вы 'придется ссылаться на соответствующий экземпляр шаблона.
Это работает для меня в MSVC 2012, используя
operator+
изstd::basic_string
template<class Test> Test test_function (Test const &a, Test const &b, Test (*FPtr)(Test const &, Test const &)) { return FPtr(a, b); } int main(int argc, char* argv[]) { typedef std::char_traits<char> traits_t; typedef std::allocator<char> alloc_t; std::basic_string<char, traits_t, alloc_t> a("test"), b("test2"); std::cout << test_function<std::basic_string<char, traits_t, alloc_t>>(a, b, &std::operator+) << std::endl; return 0; }
Если аргумент шаблона для
test_function
не учитывается, что это не удастся (по крайней мере, для MSVC 2012).
Вы можете использовать то же решение, что и в стандартной библиотеке C ++:
std::sort (numbers, numbers+5, std::greater<int>());
, где больше
template <class T> struct greater : binary_function <T,T,bool> {
bool operator() (const T& x, const T& y) const {return x>y;}
};
в вашем случае http: // www .cplusplus.com / reference / functional / greater_equal /
О ссылке встроенного оператора.
Вы можете ссылаться на существующий оператор & lt; для любого класса (конечно, если они не являются частными, защищенными или ваш класс / функция не является другом). Но оператор & lt; для встроенных типов (bool, short, int, double) это невозможно. Событие, если вы не смотрите на стандарт C ++, который вы можете видеть из моего текста выше.