Naveen_vemuri Ответов: 1

C2995: шаблон функции уже определен.


ошибка C2995:
'std:: basic_string< _Elem, _Traits, _Alloc> std:: operator +(const std:: basic_string< _Elem, _Traits, _Alloc> & amp;, const std:: basic_string< _Elem
,_Traits, _Alloc> &)': шаблон функции уже определен

ошибка C2995:
'std:: basic_string< _Elem, _Traits, _Alloc> std:: operator +(const _Elem *const, const std:: basic_string< _Elem,_Traits,_Alloc> &)': шаблон функции уже определен
.....прием.

Я получаю 23 таких ошибки.что означает эта ошибка?

Я конвертирую этот проект из visual studio 2008 в visual studio 2017.Код компилируется и строится нормально в vs 2008, но в vs2017 он выдает такие ошибки.может ли кто-нибудь помочь мне решить эту ошибку?

Что я уже пробовал:

ошибка C2382: 'std:: operator >=': переопределение; различные спецификации исключений

я тоже получаю эту ошибку.в чем смысл этой ошибки?

Richard MacCutchan

Пожалуйста, покажите код, мы не можем догадаться, о чем идет речь в этих сообщениях. Вы уверены, что не пытаетесь включить две версии заголовочных файлов?

Naveen_vemuri

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

Richard MacCutchan

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

1 Ответов

Рейтинг:
12

Jochen Arndt

Это означает, что у вас есть одни и те же объявления шаблонов в разных файлах include, которые все включены в один исходный файл.

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

Но ошибка

error C2382: 'std::operator >=': redefinition; different exception specifications
содержит подсказку: это не только переопределение, но и другое объявление (относительно исключений). Это может указывать на то, что вы включаете заголовки из разных версий SDK / VS или (сторонних) заголовочных файлов, содержащих одни и те же определения (например, с условными обозначениями, но не обнаруживаете VS 2017).

Шаблоны из ошибок определяются в строка заголовочный файл (без расширение). Поэтому вы должны проверить, включено ли это в новую версию SDK / VS, и поискать в других включенных файлах те же определения.

[РЕДАКТИРОВАТЬ]
Цитирование комментария:
и я использовал VS2017 version include file only (xstring), который содержит эти объявления шаблонов.
Никогда не включать xstring. Включать строка вместо. xstring это специфический (нестандартный) заголовочный файл MS / VS, который включен строка.
[/РЕДАКТИРОВАТЬ]


Naveen_vemuri

Это заголовочные файлы в файле. cpp.

#include "stdafx.h" ->in this included crt header files.
#включить & lt;вектор>
код #include "mystring совсем.ч"--&ГТ;(ошибка, возникающая в этом заголовочном файле)
и я использовал VS2017 version include file only (xstring), который содержит эти объявления шаблонов.

Jochen Arndt

Смотрите мой обновленный ответ.

Naveen_vemuri

извините, небольшая поправка.
Я не включал "xstring" напрямую.Но когда я проверил, где находится определение шаблона, то обнаружил, что оно находится в <xstring>, То есть оно относится к <xstring>.Я не понимаю, как он относится к этому.
даже после объявления #include & lt;string & gt; шаблон ссылается на определение в <xstring>.

Как я могу заставить его ссылаться на "строку"?

Jochen Arndt

То строка заголовочный файл включает в себя xstring заголовочный файл. Это нормально и должно остаться.

Но вы должны проверить, есть ли другие заголовочные файлы, содержащие те же объявления для std::basic_string. Возможно, вам придется проверить все файлы (то есть проверить все файлы, включенные в mystring.h и для каждого файла проверьте включенные и так далее). Вам также нужно проверить, какая версия (путь) установлена, если вы установили несколько версий SDK / VS.

Что вы можете попробовать, так это прокомментировать включение строка Если он затем компилируется, то шаблоны присутствуют из другого включаемого файла. Но вам, наконец, нужно найти это и исключить его, потому что строка это тот, который вы хотите использовать.

Существует хитрость, чтобы найти файл:
Создайте переменную типа std:: basic_string где-нибудь в вашем коде (удалите ее после выполнения следующих действий). Щелкните правой кнопкой мыши на "basic_string "и выберите"Перейти к объявлению". Затем следует открыть соответствующий заголовочный файл, сообщающий вам также путь (если у вас есть несколько файлов для выбора, возможно, у вас уже есть то, что вы ищете).

Naveen_vemuri

Спасибо, решил мою проблему