syntax error C2760. Что означает?

240
20 марта 2018, 01:40

Добрый день. Помогите пожалуйста найти ошибку в коде.

#include <string>
#include <iostream>
using namespace std;
using namespace System;
class Person
{
private:
    string name;
    string surname;
    string patronymic;
    int dayOfBirth;
    int monthOfBirth;
    int yearOfBirth;
public:
    Person(const char*, const char*, const char*, int, int, int);
    void setPerson(const char*, const char*, const char*);
    void setName(const char*);
    void setSurname(const char*);
    void setPatronymic(const char*);
    void setDayOfBirth(int);
    void setMonthOfBirth(int);
    void setYearOfBirth(int);
    void setDateOfBirth(int, int, int);
    string getName() { return this->name; }
    string getSurname() { return this->surname; }
    string getPatronimic() { return this->patronymic; }
    int getDayOfBirth() { return this->dayOfBirth; }
    int getMonthOfBirth() { return this->monthOfBirth; }
    int getYearOfBirth() { return this->yearOfBirth; }
    void printFullName() { cout << surname << " " << name << " " << patronymic << endl; }
    void printDateOfBirth() { cout << dayOfBirth << "." << monthOfBirth << "." << yearOfBirth << endl; }
    virtual ~Person() {};
private:
    bool isValidAllName(const char*);
    bool isValidPerson(const char*, const char*, const char*);
    bool isValidDay(int);
    bool isValidMonth(int);
    bool isValidYear(int);
    bool isValidDate(int, int, int);
};
Person::Person(const char* surname, const char* name, const char* patronymic, int day, int month, int year)
{
    setPerson(surname, name, patronymic);
    setDateOfBirth(day, month, year);
}

void Person::setName(const char* name)
{
    bool isValid = isValidAllName(name);
    try
    {
        if (isValid)
        {
            this->name = name;
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Not valid name! " << name << endl;
    }
}
void Person::setSurname(const char* surname)
{
    bool isValid = isValidAllName(surname);
    try
    {
        if (isValid)
        {
            this->surname = surname;
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Not valid surname! " << surname << endl;
    }
}
void Person::setPatronymic(const char* patronymic)
{
    bool isValid = isValidAllName(patronymic);
    try
    {
        if (isValid)
        {
            this->patronymic = patronymic;
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Not valid Patronymic! " << patronymic << endl;
    }
}
void Person::setPerson(const char* surname, const char* name, const char* patronymic)
{
    bool isValid = isValidPerson(surname, name, patronymic);
    try
    {
        if (isValid)
        {
            setSurname(surname);
            setName(name);
            setPatronymic(patronymic);
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Not valid full name: " << surname << " " << name << " " << patronymic << endl;
    }
}
void Person::setDateOfBirth(int day, int month, int year)
{
    bool isValid = isValidDate(day, month, year);
    try
    {
        if (isValid)
        {
            setDayOfBirth(day);
            setMonthOfBirth(month);
            setYearOfBirth(year);
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Date is wrong: " << day << "/" << month << "/" << year << endl;
    }
}
void Person::setDayOfBirth(int dayOfBirth)
{
    bool isValid = isValidDay(dayOfBirth);
    try
    {
        if (isValid)
        {
            this->dayOfBirth = dayOfBirth;
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Value is not in range: " << dayOfBirth << endl;
    }
}
void Person::setMonthOfBirth(int monthOfBirth)
{
    bool isValid = isValidMonth(monthOfBirth);
    try
    {
        if (isValid)
        {
            this->monthOfBirth = monthOfBirth;
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Month is not in range: " << monthOfBirth << endl;
    }
}
void Person::setYearOfBirth(int yearOfBirth)
{
    bool isValid = isValidYear(yearOfBirth);
    try
    {
        if (isValid)
        {
            this->yearOfBirth = yearOfBirth;
        }
        else
        {
            throw isValid;
        }
    }
    catch (bool valid)
    {
        cout << "Year is not in range: " << yearOfBirth << endl;
    }
}

bool Person::isValidPerson(const char* surname, const char* name, const char* patronymic)
{
    return isValidAllName(surname) && isValidAllName(name) && isValidAllName(patronymic);
}
bool Person::isValidDay(int day) {
    return day > 0 && day <= 31;
}
bool Person::isValidMonth(int month)
{
    return month > 0 && month <= 12;
}
bool Person::isValidYear(int year)
{
    return year > 0 && year <= 2018;
}
bool Person::isValidAllName(const char* word)
{
    char simbol = word[0];
    return simbol >= 65 && simbol <= 104 || simbol >= 192 && simbol <= 223;
}
bool Person::isValidDate(int day, int month, int year)
{
    return isValidDay(day) && isValidMonth(month) && isValidYear(year);
}

Видимо, что-то в блоке try-catch, просмотрел код сто раз, но ошибку так и не нашел. Заранее спасибо за помощь.

Вот информация об ошибках

1>------ Build started: Project: Lab_1, Configuration: Debug Win32 ------
1>Main.cpp
1>c1xx : warning C4199: two-phase name lookup is not supported for C++/CLI, C++/CX, or OpenMP; use /Zc:twoPhase-
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocale(505): error C2760: syntax error: unexpected token 'identifier', expected 'catch'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocale(505): note: This diagnostic occurred in the compiler generated function 'const _Facet &std::use_facet(const std::locale &)'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocale(2161): error C2760: syntax error: unexpected token 'identifier', expected 'catch'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocale(2315): note: see reference to class template instantiation 'std::ctype<_Elem>' being compiled
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocnum(149): error C2760: syntax error: unexpected token 'identifier', expected 'catch'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocnum(266): note: see reference to class template instantiation 'std::numpunct<_Elem>' being compiled
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocnum(181): error C2760: syntax error: unexpected token 'identifier', expected 'catch'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocnum(338): error C2760: syntax error: unexpected token 'identifier', expected 'catch'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocnum(1220): note: see reference to class template instantiation 'std::num_get<_Elem,_InIt>' being compiled
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocnum(1271): error C2760: syntax error: unexpected token 'identifier', expected 'catch'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocnum(1666): note: see reference to class template instantiation 'std::num_put<_Elem,_OutIt>' being compiled
1>Done building project "Lab_1.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Answer 1

Начнем с несуществующего пространства имен System.

Далее, сама конструкция типа

try
{
    if (isValid)
    {
        this->name = Name;
    }
    else
    {
        throw isValid;
    }
}
catch (bool valid)
{
    cout << "Not valid name! " << Name << endl;
}

вместо простого и понятного

if (isValid)
        this->name = Name;
else
    cout << "Not valid name! " << Name << endl;

мягко говоря, удивляет. Зачем?!! Да и явно перекрывающиеся проверки тоже непонятно к чему. И еще - раз valid в

catch (bool valid)

не используется - лучше писать

catch (bool)

Но в любом случае ошибка при компиляции только одна - C2871, неизвестное пространство имен. Удалив его, получаем пачку предупреждений (о ненужной valid), но код компилируется.

Чего вы недоговорили? :)

Может, это не совсем С++, а C++/CLI? тогда встречный вопрос - у вас в коде нет ничего специфичного, может, простого консольного приложения будет достаточно?

READ ALSO
Как закрыть Socket?

Как закрыть Socket?

есть отдельный поток класс который работает с Socket-омКогда я отключаю клиент он все равно продолжает работать

193
java(fx) основы

java(fx) основы

Изучаю javaХочу вызвать в консоль текст, который написан в textField

148
Сихнронизация в WEB рипложении(Java Spring)

Сихнронизация в WEB рипложении(Java Spring)

Здравствуйте, разрабатываю грубо говорю систему для автоматического проведения олимпиад и вот столкнулся с проблемой синхронизации, точне...

193