Невозможно объявить функцию без параметров в InnoSetup [duplicate]

Я помещаю превосходный ответ JLBorges на аналогичный вопрос дословно из cplusplus.com, так как это наиболее краткое объяснение, которое я прочитал по этому вопросу.

] В шаблоне, который мы пишем, есть два типа имен, которые можно использовать - зависимые имена и не зависимые имена. Зависимое имя - это имя, которое зависит от параметра шаблона; неизменяемое имя имеет то же значение, независимо от параметров шаблона.

Например:

template< typename T > void foo( T& x, std::string str, int count )
{
    // these names are looked up during the second phase
    // when foo is instantiated and the type T is known
    x.size(); // dependant name (non-type)
    T::instance_count ; // dependant name (non-type)
    typename T::iterator i ; // dependant name (type)

    // during the first phase, 
    // T::instance_count is treated as a non-type (this is the default)
    // the typename keyword specifies that T::iterator is to be treated as a type.

    // these names are looked up during the first phase
    std::string::size_type s ; // non-dependant name (type)
    std::string::npos ; // non-dependant name (non-type)
    str.empty() ; // non-dependant name (non-type)
    count ; // non-dependant name (non-type)
}

То, что зависит от зависимого имени, может быть чем-то другим для каждого конкретного экземпляра шаблона. Как следствие, шаблоны C ++ подвержены «двухфазному поиску имен». Когда шаблон сначала анализируется (до того, как выполняется какое-либо создание), компилятор просматривает не зависящие имена. Когда происходит конкретное создание шаблона, параметры шаблона известны к тому времени, и компилятор ищет зависимые имена.

На первом этапе анализатор должен знать, является ли зависимое имя именем типа или имени не-типа. По умолчанию зависимым именем считается имя не-типа.

Использовать ключевое слово typename только в объявлениях шаблонов и определениях, приведенных ниже.


у вас есть квалифицированное имя, которое относится к типу и зависит от параметра шаблона.

5
задан amalgamate 11 November 2015 в 21:38
поделиться

1 ответ

Ожидаемый идентификатор

Ваш код будет прав в Pascal, но он не компилируется в Pascal Script.

В Pascal, если вы хотите присвоить возвращаемое значение функции, вы либо присваиваете значение «переменной» с именем функции, либо переменной Result.

Итак, это правильно:

function GetRoot: string;
begin
  GetRoot := ROOTPage.Values[0];
end;

И это тоже (оба эквивалентны):

function GetRoot: string;
begin
  Result := ROOTPage.Values[0];
end;

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


Недопустимый прототип

Вы получаете это, когда функция вызванный из-за большого количества раздела Code, и требуется конкретный список параметров / возвращаемое значение. Но вы не сказали нам, что вы используете для функции GetRoot.

Есть два места, где вы можете использовать пользовательскую функцию в Inno Setup:

  • Check параметр : для этого функция должна вернуть значение Boolean и не принимать ни параметра, ни одного параметра (тип параметра определяется значением, которое вы предоставляете в параметре Check).
    function MyProgCheck(): Boolean;
    
    function MyDirCheck(DirName: String): Boolean;
    
  • Scripted Constants : функция должна возвращать значение string и принимать один параметр string, даже если в константе, заданной сценарием, не указана никакая опция. Я предполагаю, что это ваш прецедент. Если вам не нужен какой-либо параметр, просто объявите его, но не используйте его:
    function GetRoot(Param: String): string;
    begin
      Result := ROOTPage.Values[0];
    end;
    
9
ответ дан Martin Prikryl 18 August 2018 в 16:03
поделиться
  • 1
    Круто. Хорошо. Означает ли это, что мой {код: GetRoot} должен измениться на что-то вроде {code: GetRoot ('nothing')}? – amalgamate 11 November 2015 в 21:29
  • 2
    Я вижу это в вашем ответе, спасибо. Я проверю это ... – amalgamate 11 November 2015 в 21:30
  • 3
    Нет, если вам не нужно указывать параметр, продолжайте использовать {code:GetRoot}. Просто добавьте параметр dummy в объявление функции GetRoot. – Martin Prikryl 11 November 2015 в 21:32
  • 4
    Я исправил обратную косую черту в моем OP, основываясь на вашем вводе .. Спасибо. Просто привычка. – amalgamate 11 November 2015 в 21:37
  • 5
    Теперь я получаю & quot; Недопустимое количество параметров & quot; на «GetRoot: = RootPage.Values ​​[0];» линия – amalgamate 11 November 2015 в 21:42
Другие вопросы по тегам:

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