Вот еще один случай, когда сырые типы вас укусят:
public class StrangeClass<T> {
@SuppressWarnings("unchecked")
public <X> X getSomethingElse() {
return (X)"Testing something else!";
}
public static void main(String[] args) {
final StrangeClass<Object> withGeneric = new StrangeClass<>();
final StrangeClass withoutGeneric = new StrangeClass();
final String value1,
value2;
// Works
value1 = withGeneric.getSomethingElse();
// Produces compile error:
// incompatible types: java.lang.Object cannot be converted to java.lang.String
value2 = withoutGeneric.getSomethingElse();
}
}
Как уже упоминалось в принятом ответе, вы теряете всю поддержку дженериков в коде необработанного типа. Каждый параметр типа преобразуется в его стирание (которое в приведенном выше примере просто Object
).
Это скорее вопрос, связанный с оболочкой, чем вопрос на C ++. В большинстве оболочек существует множество способов цепочки команд. Предполагая, что вы используете bash (попробуйте echo $SHELL
, чтобы убедиться), взгляните на хороший учебник bash .
Попробуйте этот хак:
Вставьте эту строку в верхнюю часть файла cpp:
//&>/dev/null;x="${0%.*}";[ ! "$x" -ot "$0" ]||(rm -f "$x";g++ -o "$x" "$0")&&exec "$x" "$@"
Затем добавьте разрешение на выполнение в файле cpp, то есть (chmod +x foo.cpp
) , то:
./foo.cpp
Да. Предполагая, что ваша программа на C ++ закодирована в одном файле с именем foo.cpp:
g++ foo.cpp -o foo && ./foo
Примечание: & amp; & amp; означает: выполнить команду справа, только если команда слева преуспела
shell
: технически вышеприведенная команда по-прежнему остается одной командой) – Alexander L. Belikoff 15 November 2013 в 18:01