Спецификация типа шаблона C ++ - PullRequest
0 голосов
/ 20 мая 2018

У меня есть пустой класс с тем же именем, что и пустая функция.Когда я пытаюсь передать этот класс в качестве параметра шаблона, я получаю сообщение об ошибке:

" несоответствие типа / значения в аргументе 1 "

" 'Test'недопустимый аргумент типа шаблона для параметра '_Ty'"

Обратите внимание:

#include <vector>

void Test() {
}

class Test {
};

int main() {
    std::vector<Test> test;
}

Изменение на

std::vector<class Test>

, кажется, работает, но яне удалось выяснить, требуется ли это по стандарту или просто случайно поддерживается моим компилятором.

Может кто-то указать, как решить эту проблему или ссылку на стандарт, который требует этогоповедение?

1 Ответ

0 голосов
/ 20 мая 2018

Да, вы должны использовать ключевое слово class перед именем для устранения неоднозначности, что приводит к сложному описателю типа.

[class.name] / 2 :

(выделено мной)

Если имя класса объявляется в области, где переменная, функция или перечислитель с тем же именем также объявляются, тогда, когда оба объявления находятся в области, на класс можно ссылаться только с использованием детализированного спецификатора типа ([basic.lookup.elab]).[Пример:

struct stat {
  // ...
};

stat gstat;                     // use plain stat to define variable

int stat(struct stat*);         // redeclare stat as function

void f() {
  struct stat* ps;              // struct prefix needed to name struct stat
  stat(ps);                     // call stat()
}

- конец примера]

И [dcl.type.elab] :

уточненный спецификатор типа:

  • спецификатор атрибута ключа класса-seq opt спецификатор вложенного имени opt идентификатор
  • простой-шаблон-идентификатора ключа класса
  • спецификатор вложенного имени-ключа шаблон opt simple-template-id
  • enum спецификатор вложенного имени opt идентификатор
...