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)
它是否只是不支持确切的语法,并且一个小的更改将使它工作,或者我是否需要更改代码以避免像这样的专业化?如果后者这是一般的最佳方式吗?
您没有显示包含这些函数声明的类定义.但我认为它是一些声明这些模板的类.你必须在外面定义特化:
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,则编译器无法知道是实例化函数还是使用显式特化.前方声明告诉它.
| 归档时间: |
|
| 查看次数: |
242 次 |
| 最近记录: |