Как мы можем прочитать следующую инструкцию?

#c

#c

Вопрос:

Допустим, у нас есть следующие инструкции:

 typedef itk::Image<double, 2>  FloatImageType;

void CreateF(FloatImageType::Pointer image)
{
...
}
  

Я знаю, что :: означает функция. Но в этом случае мы должны прочитать это следующим образом?

указатель класса является членом класса FloatImageType

Спасибо.

Комментарии:

1. :: означает в области видимости, а не в функции.

2. @40 два. Спасибо за ваш ответ. И, в данном случае, это означает, что у нас есть Pointer в области FloatImageType , которая указывает (ссылается) на изображение типа FloatImageType . Правильно ли это таким образом?

3. Наиболее вероятно, Pointer это typedef в определении класса template Image . Я мало что могу вам сказать, если у меня нет определения класса template Image

Ответ №1:

Зависит от того, что Pointer есть на самом деле.

Случай 1:

 namespace itk
{
    template <class T, int X>
    struct Image
    {
        typedef int Pointer;
    };
}
  

Это называется «member typedef».

Случай 2:

 namespace itk
{
    template <class T, int X>
    struct Image
    {
        struct Pointer
        {
        };
    };
}
  

Это называется «вложенный класс».

Случай 3:

 namespace itk
{
    template <class T, int X>
    struct Image
    {
        static int const Pointer = 0;
    };
}
  

Очевидно, что это вообще не тип, а просто статическая переменная-член.

Комментарии:

1. Я полагаю, мы можем сузить круг поиска, ознакомившись с документацией itk. Быстрый поиск не позволил мне найти надлежащую ссылку на документацию. itk.org/ItkSoftwareGuide

2. Случай 3 не имеет значения, в данном случае Pointer не определяет тип. Таким образом, он не может указать тип входного аргумента функции void CreateF(FloatImageType::Pointer image) .

3. @40two: Вы правы, но из вопроса неясно, действительно ли OP пытался это сделать (столкнувшись с ошибкой компилятора).

Ответ №2:

Но в этом случае мы должны прочитать это следующим образом? указатель класса является членом класса FloatImageType

Нет, компилятору она читается следующим образом:

Я ожидаю экземпляр типа, Pointer определенного в FloatImageType классе template (без указания параметров шаблона, поэтому меня устраивает любой).
Мне не нужен экземпляр какого-то типа, который вызывается (возможно, случайно) Pointer и который, возможно, существует в глобальном пространстве имен, или тот, который вы извлекаете откуда-то еще, мне все равно. Я явно запрашиваю то, которое принадлежит FloatImageType , ничего другого.

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