Ошибка шаблона с зависимыми именами - PullRequest
2 голосов
/ 30 июня 2011

В следующем коде я получаю ошибку компиляции, которой у меня нет, если я удаляю шаблоны:

template<int DIM> class myClass
{
public :
    enum Mode {aa,bb};
    myClass(){};
};

template<int DIM> class  myClass2
{
    myClass2(){};
    void myfunc(myClass::Mode m);
};

template<int DIM>
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m)
{
}

test.cpp (19): предупреждение C4346: «myClass :: Mode»: зависимое имя не является типом
префикс с 'typename' для обозначения типа
test.cpp (19): ошибка C2146: синтаксическая ошибка: отсутствует «)» перед идентификатором «m»

Если я уберу подобное:

template<int DIM>
void myClass2<DIM>::myfunc(myClass::Mode m)

Я получаю:

test.cpp (19): ошибка C2955: «myClass»: использование шаблона класса требует списка аргументов шаблона

И если я добавлю определение myfunc непосредственно в объявление класса (которого я хотел бы избежать), оно сработает.

Что мне делать и почему это происходит?

Спасибо

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

Я считаю, что у вас есть две проблемы в вашем коде.Первая в этом объявлении в myClass2:

void myfunc(myClass::Mode m);

Поскольку myClass является шаблоном, вам нужно указать, что это за параметр шаблона.Я предполагаю, что вы, вероятно, хотели написать

void myfunc(myClass<DIM>::Mode m);

Однако из-за странной идиосинкразии в C ++ вы бы написали это как

void myfunc(typename myClass<DIM>::Mode m);

Ключевое слово typename здесь говорит C ++Mode - это имя типа, вложенного в класс myClass<DIM>.

Аналогично, далее в коде код

template<int DIM>
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m)
{
}

должен читаться как

template<int DIM>
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m)
{
}

, чтобы сообщить компилятору, что Mode - это имя типа.

Надеюсь, это поможет!

1 голос
/ 30 июня 2011

Вот, пожалуйста ...

template<int DIM> class myClass
{
public :
    enum Mode {aa,bb};
    myClass(){};
};

template<int DIM> class  myClass2
{
    myClass2(){};

    // you need to pass the template parameter to myClass
    // "typename" needs to be present when using types from templated classes
    // from within a templated class/function.
    void myfunc(typename myClass<DIM>::Mode m);
};

template<int DIM>
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...