c – 模板方法的未定义引用错误

参见英文答案 > Why can templates only be implemented in the header file?                                    16个
这让我疯狂了一个半小时.我知道这是一件小事,但找不到什么是错的(事实上,这是一个下雨的星期五下午,当然,没有帮助).

我已经定义了以下类,它将保存从文件中读取的配置参数,并允许我从我的程序中访问它们:

class VAConfig {
    friend std::ostream& operator<<( std::ostream& lhs, const VAConfig& rhs);

private:
    VAConfig();
    static std::string      configFilename;
    static VAConfig*        pConfigInstance;
    static TiXmlDocument*   pXmlDoc;
    std::map<std::string, std::string> valueHash;

public:
    static VAConfig* getInstance();
    static void setConfigFileName( std::string& filename ) { configFilename = filename; }
    virtual ~VAConfig();

    void readParameterSet( std::string parameterGroupName );
    template<typename T> T readParameter( const std::string parameterName );
    template<typename T> T convert( const std::string& value );
};

其中方法convert()在VAConfig.cpp中定义为

template <typename T>
T VAConfig::convert( const std::string& value )
{
    T t;
    std::istringstream iss( value, std::istringstream::in );
    iss >> t;
    return t;
}

一切都很简单.但是当我从主程序中测试时使用

int y = parameters->convert<int>("5");

我得到一个未定义的引用’int VAConfig :: convert< int> …’编译错误.同样适用于readParameter().

看了很多模板教程,但不能弄清楚这一点.有任何想法吗?

解决方法:

模板化代码实现永远不应该在.cpp文件中:您的编译器必须在看到调用它们的代码的同时看到它们(除非您使用explicit instantiation生成模板化对象代码,但即便如此.cpp也是错误的要使用的文件类型).

您需要做的是将实现移动到头文件或文件(如VAConfig.t.hpp),然后在使用任何模板化成员函数时将#include“VAConfig.t.hpp”移动.

上一篇:c – cmake:汇编统计


下一篇:c – 运行时链接到不在LD_LIBRARY_PATH上的动态库