description | title | ms.date | f1_keywords | helpviewer_keywords | ms.assetid |
---|---|---|---|---|---|
Learn more about: Compiler Error C2760 |
Compiler Error C2760 |
08/12/2021 |
C2760 |
C2760 |
585757fd-d519-43f3-94e5-50316ac8b90b |
Compiler Error C2760
syntax error : expected ‘name1‘ not ‘name2‘
syntax error : unexpected token ‘token1‘, expected ‘token2‘
syntax error: ‘token1‘ was unexpected here; expected ‘token2‘
Remarks
There are several ways to cause this error. Usually, it’s caused by a token sequence that the compiler can’t make sense of.
Example
In this sample, a casting operator is used with an invalid operator.
// C2760.cpp class B {}; class D : public B {}; void f(B* pb) { D* pd1 = static_cast<D*>(pb); D* pd2 = static_cast<D*>=(pb); // C2760 D* pd3 = static_cast<D*=(pb); // C2760 }
The new lambda processor available under /std:c++20
or later, or under /Zc:lambda
, enables some new conformance-mode syntactic checks in generic lambdas. The legacy lambda processor compiles this code without warnings, but the new lambda processor produces error C2760:
void f() { auto a = [](auto arg) { decltype(arg)::Type t; // C2760 syntax error: unexpected token 'identifier', expected ';' }; }
This example shows the correct syntax, now enforced by the compiler, which works in all /std
modes:
void f() { auto a = [](auto arg) { typename decltype(arg)::Type t; }; }
First note that if referring to a template argument dependent name like vector<T>::iterator
here, then you need to put typename
prior. Furthermore, depends on what T
is, this would only compile if std::cout
‘s operator<<
is accepting this T
. This, for example, compiles just fine:
#include <iostream>
#include <vector>
template <typename T>
void showset(std::vector<T> v)
{
for (typename std::vector<T>::iterator it = v.begin(); it != v.end(); it++)
{
std::cout << *it;
}
std::cout << std::endl;
}
struct foo
{
};
int main()
{
showset(std::vector<int>{1,2,3});
//showset(std::vector<foo>{}); // Error: `cout` doesn't take `foo`s.
return 0;
}
With the auto
-enhanced syntax of C++11, showset()
could be written like this, and then the typename
has no use : )
template <typename T>
void showset(std::vector<T> v)
{
for (auto it = v.begin(); it != v.end(); it++)
{
std::cout << *it;
}
std::cout << std::endl;
}
Also since C++11, you can use the range-based for loop to achieve the same as in your original snippet:
template <typename T>
void showset(std::vector<T> v)
{
for (auto& ref : v)
{
std::cout << ref;
}
std::cout << std::endl;
}
As with the lase version, because you’re not referring here to the iterator
type there’s nothing to put typename
for.
Do note that in both versions you are taking parameter v
by value. Hence, you’re copying the entire vector for each function call. As the code is given in the question, there seem to be no reason for this and so you should be passing it by reference, and make it a const
one too as you’re not modifying v
anywhere inside of showset()
:
void showset(const std::vector<T>& v);
and then in the non-range-based for loop version don’t forget to change the loop statement accordingly:
for (typename std::vector<T>::const_iterator it = v.begin(); it != v.end(); it++)
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||||||||||
1 |
||||||||||||
04.05.2019, 22:41. Показов 7052. Ответов 12 Метки ООП, шаблоны (Все метки)
При компиляции выдает ошибку : Ошибка C2760 синтаксическая ошибка: ожидался токен «спецификатор типа», а не «идентификатор» .
__________________
0 |
143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
|
04.05.2019, 22:44 |
2 |
В какой строке ошибка, а то просматривать весь код очень муторно
0 |
0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
|
04.05.2019, 22:49 [ТС] |
3 |
в 69 строке Добавлено через 51 секунду Добавлено через 48 секунд
0 |
143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
|
04.05.2019, 22:52 |
4 |
m_iArr = new init.T*[size_row]; Что такое init.T?
1 |
0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
|
04.05.2019, 23:02 [ТС] |
5 |
Что такое init.T? Да , просто T должно быть Добавлено через 2 минуты
Что такое init.T? Но когда делаю просто T , появляется
0 |
143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
|
04.05.2019, 23:04 |
6 |
Как у тебя сейчас 69 строка выглядит?
0 |
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||
04.05.2019, 23:13 [ТС] |
7 |
|||
0 |
Pashka Durov 143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
||||
04.05.2019, 23:20 |
8 |
|||
Попробуй так
Но не гарантирую
0 |
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||
05.05.2019, 11:52 [ТС] |
9 |
|||
Попробуй так
Но не гарантирую На 69 строку перестало ругаться , но всеравно есть ошибка в 72 строке : Добавлено через 1 минуту
0 |
5695 / 3134 / 1306 Регистрация: 07.02.2019 Сообщений: 7,876 |
|
05.05.2019, 11:56 |
10 |
holdem_, Просто скопируй цикл из строк 25-28.
0 |
0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
|
05.05.2019, 12:00 [ТС] |
11 |
holdem_, Просто скопируй цикл из строк 25-28. На эти строки тоже ругается .
0 |
zayats80888 5695 / 3134 / 1306 Регистрация: 07.02.2019 Сообщений: 7,876 |
||||
05.05.2019, 12:16 |
12 |
|||
На эти строки тоже ругается Матом? Добавлено через 11 минут
0 |
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||
05.05.2019, 12:57 [ТС] |
13 |
|||
Матом? Добавлено через 11 минут
Все решил проблему — действительно не нужно реализовывать шаблонные классы по разным файлам . Всем спасибо за ответы
0 |
Содержание
- Unity — Fix for Build Error C2760 in combaseapi.h — but still not working #1550
- Comments
- Библиотека GDI+ вызывает ошибку C2760: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа» в VS2017 при компиляции для XP
- Ответы (4)
- Библиотека GDI+ вызывает «ошибку C2760: синтаксическая ошибка: неожиданный токен» идентификатор «, ожидаемый» спецификатор типа «» в VS2017 при компиляции для XP
- 4 ответа
- Библиотека GDI + вызывает ошибку C2760: синтаксическая ошибка: неожиданный токен «идентификатор», ожидаемый «спецификатор типа» »в VS2017 при компиляции для XP
- Как создать проект C++, отличный от MFC, со статической привязкой к библиотекам времени выполнения VC?
Unity — Fix for Build Error C2760 in combaseapi.h — but still not working #1550
Hi, still can’t get the copter working. I did find a fix for the C2670 error though. Any thoughts appreciated.
Win 10 Home
Unity 2018.2.15f1
VS Community 2017 15.8.9
SDK 8.1
Unity/build.cmd Build fails with:
windows kits8.1includeumcombaseapi.h(229): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’
1: Open (make backup first of course) C:Program Files (x86)Windows Kits8.1Includeumcombaseapi.h
2: Add struct IUnknown; // Workaround for «combaseapi.h(229): error C2187: syntax error: ‘identifier’ was unexpected here» when using /permissive-
3: Put this line at top of file above includes
4: Rebuild
5: Build succeeds but with warning:
«..PathAirSimUnityAirLibWrapperAirsimWrapper.sln» (Clean;Build target) (1) ->
«..PathAirSimUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj.metaproj» (default ta
rget) (2:2) ->
«..PathAirSimUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj» (default target) (5:
2) ->
(Link target) ->
LINK : warning LNK4075: ignoring ‘/INCREMENTAL’ due to ‘/LTCG’ specification [..PathAirSi
mUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj]
6: Run project SimModeSelector Unity Project Warning:
Cannot read settings file C:Program FilesUnityEditorsettings.json Vehicle=SimpleFlight
UnityEngine.Debug:LogError(Object)
AirSimUnity.Vehicle:PrintLogMessage(String, String, String, Int32) (at Assets/AirSimAssets/Scripts/Vehicles/Vehicle.cs:279)
AirSimUnity.VehicleCompanion:PrintLogMessage(String, String, String, Int32) (at Assets/AirSimAssets/Scripts/Vehicles/VehicleCompanion.cs:193)
7: Create settings.json file in Assets folder:
<
«SettingsVersion»: 1.2,
«SimMode»: «Multirotor»
>
8: Run Unity Project SimModeSelector. Copter does not respond to Page Up/Down & WASD
Car responds to WASD
The text was updated successfully, but these errors were encountered:
Источник
Библиотека GDI+ вызывает ошибку C2760: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа» в VS2017 при компиляции для XP
Я пытаюсь включить следующие определения для GDI+ в свой проект Win32 C++, скомпилированный в Visual Studio 2017:
Мне нужно скомпилировать этот проект для поддержки Windows XP. Итак, в свойствах проекта я выбрал: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :
Но когда я компилирую его, библиотека GDI+ дает мне это:
Есть идеи, как это исправить?
Ответы (4)
Добавьте эту строку перед самым первым (!) #include заголовком, связанным с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :
Это исправление работает, потому что строка в objbase.h(239) , упомянутая в ошибке, содержит static_cast (*pp); , несмотря на то, что IUnknown еще не был объявлен в этом месте.
Я как бы получил его для компиляции, но это определенно не очень хорошее решение. Я публикую это здесь в качестве временного обходного пути, пока Microsoft не вылезет из головы. Также, если кто-то найдет лучший способ, пожалуйста, дайте мне знать.
По сути, мне пришлось понизить весь проект до Visual Studio 2015 — Windows XP (v140_xp) только для того, чтобы скомпилировать одну плохо написанную библиотеку:
Это создало собственную проблему с библиотеками std :
Поэтому мне пришлось шунтировать эти ошибки небезопасных функций:
Что далеко от идеала!
(По сути, вы жертвуете безопасностью приложения только для того, чтобы скомпилировать эту чертову библиотеку GDI+.)
Есть способ заставить это работать, если вы готовы редактировать заголовочные файлы Windows.
В objbase.h закомментируйте строку 239 или измените ее на:
В gdiplusheaders.h , строка 891, удалите лишний квалификатор ( Metafile:: ).
В gdiplusstringformat.h , строка 220, удалите лишний квалификатор ( StringFormat:: ).
Надеюсь, это исправит ситуацию для вас, ничего не сломав.
Хотя вопрос старый, просто добавляю то, что сработало для меня.
В моем случае включение windows.h и компиляция с набором инструментов VS2017 v141_xp вызывали у меня ошибку: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «спецификатор типа».
Источник
Библиотека GDI+ вызывает «ошибку C2760: синтаксическая ошибка: неожиданный токен» идентификатор «, ожидаемый» спецификатор типа «» в VS2017 при компиляции для XP
Я пытаюсь включить следующие определения для GDI+ в мой проект Win32 C++, который скомпилирован в Visual Studio 2017:
Мне нужно скомпилировать этот проект для поддержки Windows XP. Поэтому в свойствах проекта я выбрал: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :
Но когда я компилирую это, библиотека GDI+ дает мне это:
Есть идеи как это исправить?
4 ответа
Добавьте эту строчку перед самым первым (!) #include заголовка, связанного с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :
Это исправление работает, потому что строка в objbase.h(239) упомянутый в ошибке содержит static_cast (*pp); несмотря на то, что IUnknown до сих пор не объявлен в этом месте.
Я вроде получил его для компиляции, но это определенно не хорошее решение. Я опубликую его здесь как временное решение, пока Microsoft не избавится от своих ___ идей. Также, если кто-нибудь найдет лучший способ, пожалуйста, дайте мне знать.
Я в основном должен был понизить весь проект до Visual Studio 2015 — Windows XP (v140_xp) просто скомпилировать одну плохо написанную библиотеку:
Это создало собственную проблему с std библиотеки:
Таким образом, я должен был избежать ошибок небезопасных функций:
Что далеко от идеала!
(Вы в основном жертвуете безопасностью приложения, просто чтобы скомпилировать эту чертову библиотеку GDI+.)
Есть способ заставить это работать, если вы готовы редактировать заголовочные файлы Windows.
В objbase.h закомментируйте строку 239 или измените ее на:
В gdiplusheaders.h , строка 891, удалите лишний квалификатор ( Metafile:: ).
В gdiplusstringformat.h , строка 220, удалите лишний классификатор ( StringFormat:: ).
Надеюсь, это исправит ситуацию, не сломав ничего.
Хотя вопрос старый, просто добавляю то, что сработало для меня.
В моем случае включение windows.h и компиляция с набором инструментов VS2017 v141_xp вызывали у меня ошибку: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа».
Источник
Библиотека GDI + вызывает ошибку C2760: синтаксическая ошибка: неожиданный токен «идентификатор», ожидаемый «спецификатор типа» »в VS2017 при компиляции для XP
Я пытаюсь включить следующие определения для GDI + в свой проект Win32 C ++, который скомпилирован в Visual Studio 2017:
Мне нужно скомпилировать этот проект для поддержки Windows XP. Итак, в выбранном мной проекте свойства: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :
Но когда я его компилирую, библиотека GDI + дает мне следующее:
Есть идеи, как это исправить?
Добавьте эту строку перед самым первым (!) #include Заголовком, связанным с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :
Это исправление работает, потому что строка, objbase.h(239) упомянутая в ошибке, содержит, static_cast (*pp); несмотря на то, что IUnknown еще не был объявлен в этом месте.
Мне удалось его скомпилировать, но это определенно не лучшее решение. Я публикую это здесь как временный обходной путь, пока Microsoft не избавится от своих ___es. Также, если кто-нибудь найдет способ получше, дайте мне знать.
Мне в основном пришлось понизить версию всего проекта, чтобы Visual Studio 2015 — Windows XP (v140_xp) просто скомпилировать одну плохо написанную библиотеку:
Это создало собственную проблему с std библиотеками:
Поэтому мне пришлось устранить эти ошибки небезопасных функций:
Что далеко не идеально!
(По сути, вы жертвуете безопасностью приложения только для того, чтобы скомпилировать эту чертову библиотеку GDI +.)
Источник
Как создать проект C++, отличный от MFC, со статической привязкой к библиотекам времени выполнения VC?
Я знаю, что для проекта MFC, созданного с помощью Visual Studio, можно перейти в свойства проекта, а затем Configuration Properties -> General -> use of MFC и изменить его на Use MFC in a static library :
Это работает, если полученная сборка должна запускаться в более ранних версиях Windows без необходимости установки DLL времени выполнения MFC или VC. Полученная сборка будет использовать библиотеки DLL, которые уже присутствуют в каждой установке Windows, начиная с Windows 7 и выше. (Возможно, даже до Windows XP.)
Теперь, если я создаю проект без MFC, скажем, тестовое консольное приложение C++, параметр для использования MFC настроен как «Использовать стандартные библиотеки Windows»:
Но если я запустил полученный двоичный файл, скажем, при новой установке Windows 7, я получаю такую ошибку:
Итак, покопавшись в настройках, я не смог найти способ скомпилировать его со статической привязкой ко всем этим новым версиям библиотек VC RT. Он есть, а я его просто не вижу?
PS. Покопавшись дальше, я обнаружил, что могу изменить «Platform Toolset» на Visual Studio 2017 — Windows XP (v141_xp) , предполагая, что это сделает его обратно совместимым с Windows XP и выше:
Но затем, если я его скомпилирую, я получаю следующие ошибки:
В этой части файла ObjBase.h , который не имеет ничего общего с моим тестовым консольным проектом C++, который я только что создал из шаблона Visual Studio:
Итак, мой вопрос: могу ли я создать проект на C++, отличный от MFC, который может работать в более старых версиях Windows без необходимости установки VC Runtime или каких-либо других дополнительных библиотек?
Источник
VC++ 2017 reports C2760 error with this code:
template <typename x>
struct y
{
static void z()
{
using def = typename x::d<0>;
}
};
struct some
{
template <int N> struct d;
};
// ... y<some> ...
Compiler output:
my.cpp(6): error C2760: syntax error: unexpected token '<', expected ';'
my.cpp(8): note: see reference to class template instantiation 'y<x>' being compiled
The question is how write def
definition inside of y::z
?
asked Jul 24, 2018 at 13:55
0
using def = typename x::template d<0>;
The compiler needs to be told that d
is a template, otherwise <
is interpreted as a less-than operator, not as the opening angle bracket.
answered Jul 24, 2018 at 13:57
Igor TandetnikIgor Tandetnik
49.8k4 gold badges56 silver badges84 bronze badges
VC++ 2017 reports C2760 error with this code:
template <typename x>
struct y
{
static void z()
{
using def = typename x::d<0>;
}
};
struct some
{
template <int N> struct d;
};
// ... y<some> ...
Compiler output:
my.cpp(6): error C2760: syntax error: unexpected token '<', expected ';'
my.cpp(8): note: see reference to class template instantiation 'y<x>' being compiled
The question is how write def
definition inside of y::z
?
asked Jul 24, 2018 at 13:55
0
using def = typename x::template d<0>;
The compiler needs to be told that d
is a template, otherwise <
is interpreted as a less-than operator, not as the opening angle bracket.
answered Jul 24, 2018 at 13:57
Igor TandetnikIgor Tandetnik
49.8k4 gold badges56 silver badges84 bronze badges
Сообщение об ошибке сообщает вам, что вы можете сделать:
typename std::map<std::string, _Value>::iterator itr = this->begin();
// ^^^^^^^^^
… но не потому, что вам нужно.
Короче говоря, это причуда C++, относящаяся к шаблонам и так называемым «зависимым именам». Поскольку _Value
является параметром шаблона, и поскольку существует специализированная специализация шаблона, C++ не может точно знать, что std::map<std::string, _Value>
имеет iterator
типа члена, пока немного позже в процессе синтаксического анализа. Таким образом, ваша декларация плохо сформирована, потому что компилятор не может воспринимать ее как декларацию, даже если она скривится. typename
говорит, что «это будет тип, я обещаю», а затем все отлично (пока это окажется типом!).
Вы можете подумать, что это должна быть проблема C++, а не ваша, и вы, вероятно, будете правы, но это так, как есть. Вы можете найти дополнительную информацию об этом или просто считать само собой разумеющимся, что, когда компилятор говорит вам написать typename
, вы пишете typename
.
С другой стороны, сделать код лучше и решить эту проблему, в то же время, с помощью auto
вместо этого:
auto itr = this->begin();
Кстати, ваш код подсказывает, что вы используете неправильный контейнер, GetItem
должен быть const
, вы должны использовать cbegin()
not begin()
(хотя это для вас сделано, если вы следуете предложению const
) и std::advance
уже существует…