Я хотел бы получить шаблон класса из QuantLib :: PiecewiseYieldCurve. Это мое получено определение класса:C++: получить шаблон класса из QuantLib :: PiecewiseYieldCurve
#include <ql\termstructures\yield\piecewiseyieldcurve.hpp>
#include <MarKetQuote\include\OISQuote.h>
#include <vector>
using namespace QuantLib;
/*! \brief Class to bootstrap an OIS curve.
*/
template <class Traits, class Interpolator,
template <class> class Bootstrap = IterativeBootstrap>
class OISCurve : public PiecewiseYieldCurve < Traits, Interpolator, Bootstrap >
{
private:
/** Typedef to refer to the specialized class.
It was necessary to add it in other to be able to declare the constructor as in QuantLib::PiecewiseYieldCurve.
*/
typedef OISCurve<Traits, Interpolator, Bootstrap> this_ois_curve;
public:
/** Constructor.
*/
OISCurve(
const Date& referenceDate,
const std::vector<OISQuote>& quotes,
const DayCounter& dayCounter,
Real accuracy,
const Interpolator& i = Interpolator(),
const Bootstrap<this_ois_curve>& bootstrap = Bootstrap<this_ois_curve>());
};
OISQuote просто класс, производный от QuantLib :: SimpleQuote. Я не знаком с этим сложным шаблоном, но, к моему ограниченному пониманию, это должно быть хорошо. Он компилируется на самом деле. Проблема возникает, когда я пытаюсь создать экземпляр специализированного класса, как это:
OISCurve<Discount, LogLinear> oisCurve = OISCurve<Discount, LogLinear>(Date::todaysDate(), quotes, Actual360(), 1.0e-12);
Я получаю LNK2019 ошибки связывания (с помощью Visual Studio):
main.obj : error LNK2019: unresolved external symbol "public: __cdecl OISCurve<struct QuantLib::Discount,class QuantLib::LogLinear,class QuantLib::IterativeBootstrap>::OISCurve<struct QuantLib::Discount,class QuantLib::LogLinear,class QuantLib::IterativeBootstrap>(class QuantLib::Date const &,class std::vector<class OISQuote,class std::allocator<class OISQuote> > const &,class QuantLib::DayCounter const &,double,class QuantLib::LogLinear const &)" ([email protected]@[email protected]@[email protected]@[email protected]@@@[email protected]@[email protected]@[email protected]@@[email protected]@@@[email protected]@@[email protected]@[email protected]@[email protected]@@Z) referenced in function main
1>C:\Users\u8998\PricingEngine\build\Debug\main.exe : fatal error LNK1120: 1 unresolved externals
Спасибо за помощь.
EDIT:
Извините за поздний ответ. Спасибо @LuigiBallabio и @StudentT за ваши ответы. Моя проблема была вызвана моей неопытной работой с шаблонами классов. У меня было объявление в файле заголовка и моей реализации в файле cpp точно так же, как и в любом другом классе. Следуя указаниям в принятом ответе this question я изменил свой код соответственно:
OISCurve.h
#ifndef OIS_CURVE_H
#define OIS_CURVE_H
#include <ql\termstructures\yield\piecewiseyieldcurve.hpp>
#include <ql\termstructures\yield\ratehelpers.hpp>
#include <ql\quote.hpp>
#include <vector>
#include <boost\shared_ptr.hpp>
using namespace QuantLib;
template <class Traits, class Interpolator,
template <class> class Bootstrap = IterativeBootstrap>
class OISCurve : public PiecewiseYieldCurve < Traits, Interpolator, Bootstrap >
{
public:
OISCurve(const Date& referenceDate,
const std::vector<boost::shared_ptr<Quote>>& quotes,
const DayCounter& dayCounter,
Real accuracy);
friend std::vector<boost::shared_ptr<RateHelper>> getRateHelpers(const std::vector<boost::shared_ptr<Quote>>& quotes);
private:
std::vector<boost::shared_ptr<Quote>> quotes_;
};
#include <CurveBootstrapping\src\OISCurve.cpp>
#endif
OISCurve.cpp
#include "OISCurve.h"
#include <ql\errors.hpp>
#include <algorithm>
#include <boost\foreach.hpp>
#include <ql\termstructures\yield\oisratehelper.hpp>
#include <MarKetQuote\include\OISQuote.h>
#include <ql\handle.hpp>
#include <ql\indexes\ibor\eonia.hpp>
#ifndef OIS_CURVE_IMPL
#define OIS_CURVE_IMPL
template <class T, class I, template <class> class B>
OISCurve<T, I, B>::OISCurve(
const Date& referenceDate,
const std::vector<boost::shared_ptr<Quote>>& quotes,
const DayCounter& dayCounter,
Real accuracy)
: PiecewiseYieldCurve < T, I, B >(referenceDate,
initializeQuotesAndGetRateHelpers(quotes),
dayCounter,
accuracy)
{
std::cout << "constructor works" << std::endl;
}
std::vector<boost::shared_ptr<RateHelper>> getRateHelpers(const std::vector<boost::shared_ptr<Quote>>& quotes)
{
QL_REQUIRE(std::all_of(quotes.begin(), quotes.end(), [](boost::shared_ptr<Quote> quote){ return boost::dynamic_pointer_cast<OISQuote>(quote) != 0; }),
"All quotes must be OISQuotes!");
std::vector<boost::shared_ptr<RateHelper>> rateHelpers;
BOOST_FOREACH(boost::shared_ptr<Quote> quote, quotes)
{
rateHelpers.push_back(boost::shared_ptr<RateHelper>(new OISRateHelper(2,
boost::dynamic_pointer_cast<OISQuote>(quote)->tenor(),
Handle<Quote>(quote),
boost::shared_ptr<OvernightIndex>(new Eonia()))));
}
return rateHelpers;
}
#endif
Это решение я понравилось больше всего.
Этот вопрос относится к обмену столов, поскольку его программирование связано. – chollida
hmm quantlib - это самый большой проект кодирования с открытым исходным кодом для количественного финансирования, и вопрос заключается в том, как его использовать, поэтому я думаю, что он принадлежит больше на quant.stackexchange.com. –