我已按照this question/answer中的说明操作,并创建了一个模板类:
// ConfigItems.hpp
#pragma once
#include <memory>
#include <string>
template< typename T > class ConfigItem : public IConfigItem // here IConfigItem is the class that has the virtual members
{
private:
T m_value;
public:
ConfigItem< T >(const T& valueIn = 0);
std::ostream &printTo(std::ostream &outIn) const;
operator T() const;
};
template< typename T, typename ...Args > std::unique_ptr< T > make_unique(Args&& ...args);
实施在这里:
// ConfigItems.cpp
#include "ConfigItems.hpp"
template< typename T > ConfigItem< T >::ConfigItem(const T& valueIn) : m_value(valueIn) {}
template< typename T > ConfigItem< T >::operator T() const
{
return m_value;
}
template< typename T > std::ostream& ConfigItem< T >::printTo(std::ostream& outIn) const
{
return outIn << m_value;
}
template< typename T, typename ...Args > std::unique_ptr< T > make_unique(Args&& ...args)
{
return std::unique_ptr< T >(new T(std::forward< Args >(args)...));
}
我创建了一个ConfigFile类:
// ConfigFile.hpp
#pragma once
class ConfigFile
{
private:
static const std::string sm_inputFolderPath;
std::map<std::string, std::unique_ptr< IConfigItem > > m_configMap;
public:
ConfigFile(const std::string& nameIn);
~ConfigFile();
};
实现:
// ConfigFile.cpp
#include "ConfigFile.hpp"
const std::string ConfigFile::sm_inputFolderPath = "input_folder_path";
ConfigFile::ConfigFile(const std::string& nameIn)
{
PTree tmpPT;
json::read_json(nameIn, tmpPT);
m_configMap.emplace(
ConfigFile::sm_inputFolderPath,
make_unique< ConfigItem< std::string > >(tmpPT.get< std::string >(ConfigFile::sm_inputFolderPath))); // here I get the error
}
我收到链接错误(未编译):
undefined reference to `std::unique_ptr<ConfigItem<std::string>, std::default_delete<ConfigItem<std::string> > > make_unique<ConfigItem<std::string>, std::string>(std::string&&)'
我不确定这里有什么问题。我正在使用c ++ 11,这就是为什么我添加了make_unique
的功能。任何人都可以帮我解决这个问题吗?我做错了什么?