Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates C++;11共享ptr模板的向量_Templates_C++11_Vector_Xcode5_Shared Ptr - Fatal编程技术网

Templates C++;11共享ptr模板的向量

Templates C++;11共享ptr模板的向量,templates,c++11,vector,xcode5,shared-ptr,Templates,C++11,Vector,Xcode5,Shared Ptr,我正在尝试调用以下函数模板: template<typename T> bool select(const std::string& ddbbName, const std::string& sql, std::vector<std::shared_ptr<T>>& vResultSet, SqlErrorInfo&

我正在尝试调用以下函数模板:

    template<typename T>
    bool select(const std::string& ddbbName,
                const std::string& sql,
                std::vector<std::shared_ptr<T>>& vResultSet,
                SqlErrorInfo& errorInfo);
SQLiteMgr.h文件:

#ifndef __TestSharedPtr__SQLiteMgr__
#define __TestSharedPtr__SQLiteMgr__

#include <iostream>
#include <vector>
#include <memory>

namespace Cucut
{
    struct SqlErrorInfo
    {
        int rc;
        std::string description;
    };

    class SQLite3Manager
    {
    private:

        SQLite3Manager();
        SQLite3Manager(const SQLite3Manager& rs);
        SQLite3Manager(SQLite3Manager&& rs);
        SQLite3Manager& operator = (const SQLite3Manager& rs);
        SQLite3Manager& operator = (SQLite3Manager&& rs);

    public:

        static SQLite3Manager& getInstance();
        template<typename T>
        bool select(const std::string& ddbbName,
                    const std::string& sql,
                    std::vector<std::shared_ptr<T>>& vResultSet,
                    SqlErrorInfo& errorInfo);
    };
}

#endif /* defined(__TestSharedPtr__SQLiteMgr__) */
\ifndef\uuuu TestSharedPtr\uuu SQLiteMgr__
#定义uuu TestSharedPtr_uuusqlitemgr__
#包括
#包括
#包括
名称空间Cucut
{
结构SqlErrorInfo
{
int rc;
std::字符串描述;
};
类SQLite3Manager
{
私人:
SQLite3Manager();
SQLite3Manager(const SQLite3Manager&rs);
SQLite3Manager(SQLite3Manager&rs);
SQLite3Manager&operator=(常量SQLite3Manager&rs);
SQLite3Manager&operator=(SQLite3Manager&rs);
公众:
静态SQLite3Manager&getInstance();
模板
bool select(const std::string和ddbbName,
常量std::字符串和sql,
std::vector&vResultSet,
SqlErrorInfo&errorInfo);
};
}
#endif/*已定义(\uuuu TestSharedPtr\uuuu SQLiteMgr\uuuuuu)*/
最后是SQLiteMgr.cpp文件:

#include "ES.h"

namespace Cucut
{
    ES::ES() :
    _id(0)
    {
    }

    const unsigned int& ES::getId() const
    {
        return _id;
    }

    void ES::setId(const unsigned int& id)
    {
        _id = id;
    }
}
#include <memory>
#include <vector>
#include "SQLiteMgr.h"

namespace Cucut
{
    SQLite3Manager::SQLite3Manager()
    {
    }

    SQLite3Manager& SQLite3Manager::getInstance()
    {
        static SQLite3Manager instance;

        return instance;
    }

    template<typename T>
    bool SQLite3Manager::select(const std::string& ddbbName, 
                                const std::string& sql,
                                std::vector<std::shared_ptr<T>>& vResultSet,
                                SqlErrorInfo& errorInfo)
    {
        return true;
    }
}
#包括
#包括
#包括“SQLiteMgr.h”
名称空间Cucut
{
SQLite3Manager::SQLite3Manager()
{
}
SQLite3Manager&SQLite3Manager::getInstance()
{
静态SQLite3Manager实例;
返回实例;
}
模板
bool SQLite3Manager::select(const std::string和ddbbName,
常量std::字符串和sql,
std::vector&vResultSet,
SqlErrorInfo和errorInfo)
{
返回true;
}
}
不要因为名称“SqliteMgr”而分心,因为在前面的示例中,为了简化问题,我删除了对sqlite3的任何类型的引用;因此,我似乎没有以正确的方式调用或定义方法“select”,因为我得到了前面提到的链接错误


任何帮助都将不胜感激。提前感谢。

函数模板定义必须始终位于头文件中,以便可以在实例化时生成代码(这里是main)。如果您不这样做,编译器将期望您手动实例化模板,这就是为什么会出现链接器错误的原因。将select函数的主体移动到SQLiteMgr.h,它就会工作。

你需要修复你的标题,包括停止使用的防护,你完全正确!第一次编写这个类时,我没有使用任何模板,但在修改它之后,我忘记了将模板方法的主体移动到标题。谢谢!
#include "ES.h"

namespace Cucut
{
    ES::ES() :
    _id(0)
    {
    }

    const unsigned int& ES::getId() const
    {
        return _id;
    }

    void ES::setId(const unsigned int& id)
    {
        _id = id;
    }
}
#ifndef __TestSharedPtr__SQLiteMgr__
#define __TestSharedPtr__SQLiteMgr__

#include <iostream>
#include <vector>
#include <memory>

namespace Cucut
{
    struct SqlErrorInfo
    {
        int rc;
        std::string description;
    };

    class SQLite3Manager
    {
    private:

        SQLite3Manager();
        SQLite3Manager(const SQLite3Manager& rs);
        SQLite3Manager(SQLite3Manager&& rs);
        SQLite3Manager& operator = (const SQLite3Manager& rs);
        SQLite3Manager& operator = (SQLite3Manager&& rs);

    public:

        static SQLite3Manager& getInstance();
        template<typename T>
        bool select(const std::string& ddbbName,
                    const std::string& sql,
                    std::vector<std::shared_ptr<T>>& vResultSet,
                    SqlErrorInfo& errorInfo);
    };
}

#endif /* defined(__TestSharedPtr__SQLiteMgr__) */
#include <memory>
#include <vector>
#include "SQLiteMgr.h"

namespace Cucut
{
    SQLite3Manager::SQLite3Manager()
    {
    }

    SQLite3Manager& SQLite3Manager::getInstance()
    {
        static SQLite3Manager instance;

        return instance;
    }

    template<typename T>
    bool SQLite3Manager::select(const std::string& ddbbName, 
                                const std::string& sql,
                                std::vector<std::shared_ptr<T>>& vResultSet,
                                SqlErrorInfo& errorInfo)
    {
        return true;
    }
}