Greek Varak Ответов: 2

Продолжает получать ошибки в коде C++ функции "X" не является членом "класс y" , "x функция" неизвестный спецификатор переопределения , "непредвиденная лексема выше "; ""


//.CPP file 
#include "stdafx.h"
using namespace System;
using namespace System::Collections::Generic;
namespace XNameSpace{

	UserId ClassName::GetId() // 'GetId' is not a member of ClassName
	{
		String^ strUserName = "sdfasd";
		String^ strPasscode = "sdfa";
		UserId ^ObjRole= AuthenticationManager::NewKTRole();

		Dictionary<String^, Object^>^ users= gcnew Dictionary<String^, Object^>();

		users->Add("UserName", strUserName);
		usersusers->Add("Passcode", strPasscode);

		UserId Id = (UserId)ObjRole->GetId(users);

		return Id;
	};
}

/ФАЙЛ /.H
#include "stdafx.h"

namespace XNameSpace{
	
	class ClassName
	{
	public:
		UserId GetId(); // Error 'GetId' Unknown override specifier // syntax error : '(' , unexpected token preceding ;
	};

	enum UserId
	{
		KTUniversal = -1,

		None,
		//
		C4,
		//
		C5,
		//
		C1,
		//
		C2,
		//
		C3,
	};


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

Я получаю ошибки
1) неизвестный спецификатор переопределения 'GetId'
2) синтаксическая ошибка : '('
3) неожиданный токен предшествующий ;
4) 'GetId' не является членом ClassName
Обычно мы сохраняем декларацию в заголовке и ее реализацию в файле CPP.

Может ли кто-нибудь помочь в этой теме?

Afzaal Ahmad Zeeshan

Ваш UserId это перечисление, и вы ожидаете, что вызовете функцию на нем. Есть на то причины?

2 Ответов

Рейтинг:
16

Jochen Arndt

Переместите enum определение над определением класса в заголовочном файле или добавьте прямое объявление:

namespace XNameSpace{

    // Forward declaration for UserId enum
    enum UserId;

    // Can now use the UserId enum here
    class ClassName
    {
    public:
        UserId GetId();
    };
    
    // enum definition
    enum UserId
    {
        KTUniversal = -1,
        // ...
    };
    // ...
}
Ваш enum обрабатывается как класс: он должен быть объявлен перед первым использованием. Единственное исключение-это когда он является частью (членом) класса. Затем он может быть определен после использования другими членами:
class ClassName
{
public:
    // Can use ClassNameUserId here because it is a class member
    ClassNameUserId GetId();

    enum ClassNameUserId
    {
        KTUniversal = -1,
    };
};


KarstenK

Лучше всего также реализовать перечисления в начале заголовочного файла. Иногда имеет смысл сделать перечисления общедоступными.

Jochen Arndt

Конечно. Поэтому я предложил это (что позволяет перечислению быть публичным).

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

Рейтинг:
12

CPallini

Цитата:
UserId GetId();</blockquoteUserId тип не объявлен.