2015-07-18 9 views
0

Я пытаюсь реализовать исключение и выбросить его из моего метода.ожидаемое первичное выражение перед ';' token

Вот h файл за исключением

#ifndef EXCEPTION_H 
#define EXCEPTION_H 

#include <exception> 
#include <string> 

namespace core { 

class no_implementation: public std::exception { 
private: 
    std::string error_message; 
public: 
    no_implementation(std::string error_message); 
    const char* what() const noexcept; 
}; 

typedef no_implementation noimp; 

} 

#endif 

А вот cpp файл

#include "../headers/exception.h" 

using namespace core; 

no_implementation::no_implementation(std::string error_message = "Not implemented!") { 
    this->error_message = error_message; 
} 

const char* no_implementation::what() const noexcept { 
    return this->error_message.c_str(); 
} 

А вот метод

std::string IndexedObject::to_string() { 
    throw noimp; 
} 

Но он показывает мне ошибку

throw noimp; //expected primary-expression before ';' token 

В чем проблема?

+0

Должно ли это быть «бросить no_implementation»? Ps используют 'const' и ссылки при передаче' std :: String' –

ответ

6

Для создания временного типа вы должны будете использовать обозначение, как это (обратите внимание на дополнительные скобки):

throw noimp(); 

Без скобок вы пытаетесь бросить тип, а не объект. Вы также укажете строку, если вы не переместите значение по умолчанию в объявление: по умолчанию оно должно быть видимым, когда оно используется.

2

Прежде всего, аргументы по умолчанию, такие как std::string error_message = "Not implemented!", должны идти в объявлении функции, а не в определении. То есть, напишите

... 
public: 
    no_implementation(std::string error_message = "Not implemented!"); 
... 

Во-вторых, вы бросаете значения, а не типы. Вы написали throw noimp;, но noimp - это имя класса. Вероятно, это должно быть throw noimp(); или throw noimp("some message here");.

Смежные вопросы