类模板特化问题

Fir*_*cer 0 c++ scope g++ specialization visual-c++

我正在尝试将一些代码从VC9移植到G ++,但是我遇到了模板特化的问题,显然不允许类成员使用.

以下代码是类方法的getValue特化的这些错误的示例.在所有情况下,错误都是"错误:非命名空间范围中的显式特化class ..."

template<typename T> T getValue(const_iterator key)const
{
    try{return boost::lexical_cast<T>(key->second);}
    catch(boost::bad_lexical_cast &e)
    {
        throw TypeParseError<T>(name, key->first, e.what());
    }
}
template<typename T> T getValue(const std::string &key)const
{
    iterator i = find(key);
    if(i == end())throw KeyNotFound(name,key);
    else return getValue(i);
}
template<> std::string getValue<std::string>(const_iterator key)const
{
    return key->second;
}
template<> std::string getValue<std::string>(const std::string &key)const
{
    const_iterator i = find(key);
    if(i == end())throw KeyNotFound(name,key);
    else return i->second;
}
Run Code Online (Sandbox Code Playgroud)

它是否只是不支持确切的语法,并且一个小的更改将使它工作,或者我是否需要更改代码以避免像这样的专业化?如果后者这是一般的最佳方式吗?

Joh*_*itb 7

您没有显示包含这些函数声明的类定义.但我认为它是一些声明这些模板的类.你必须在外面定义特化:

struct SomeClass {
   template<typename T> T getValue(const_iterator key)const
    {
        try{return boost::lexical_cast<T>(key->second);}
        catch(boost::bad_lexical_cast &e)
        {
            throw TypeParseError<T>(name, key->first, e.what());
        }
    }
    template<typename T> T getValue(const std::string &key)const
    {
        iterator i = find(key);
        if(i == end())throw KeyNotFound(name,key);
        else return getValue(i);
    }
};

template<> inline std::string SomeClass::getValue<std::string>(const_iterator key)const {
    return key->second;
}

template<> inline std::string SomeClass::getValue<std::string>(const std::string &key)const {
    const_iterator i = find(key);
    if(i == end())throw KeyNotFound(name,key);
    else return i->second;
}
Run Code Online (Sandbox Code Playgroud)

请记住,由于您已在外部定义它们,因此它们不是隐式内联的,因此您必须明确地将它们内联,或者将它们移动到cpp文件(而不是标题)中,并在头部中向前声明特征化,如下所示:

template<> inline std::string SomeClass::getValue<std::string>(const_iterator key)const;
template<> inline std::string SomeClass::getValue<std::string>(const std::string &key)const;
Run Code Online (Sandbox Code Playgroud)

如果省略forward-declaration,则编译器无法知道是实例化函数还是使用显式特化.前方声明告诉它.