header — создание объекта в пространстве имен с помощью конструктора, который определен в том же пространстве имен. Переполнение стека

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

space.h

#ifndef SPACE_H
#define SPACE_H
namespace fobj{

class function_object
{
public:
function_object(double (*f)(double)) { raw_function = f; }
double operator()(double x) {return raw_function(x); }
private:
double (*raw_function)(double);
};

}

namespace fraw {

double raw(double x);

/** below is the trouble maker. When removed, the error doesn't occur. But also,
when the above is instead declared inline, the error doesn't occur either. **/

fobj:: function_object obj( raw );

}
#endif

space.cpp

#include "space.h"
double fraw:: raw(double x) { return x; }

main.cpp

#include <iostream>
#include "space.h"
int main()
{
std::cout<< fraw::raw(1.5)<<std::endl;
std::cout<< fraw::obj(2.5)<<std::endl;
return 0;
}

1

Решение

fobj:: function_object obj( raw ); является определением — включение заголовка в несколько единиц перевода нарушает одно правило определения. Объявите переменную как extern и определить его в одном файле реализации.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]