我发现模板专业化的问题很奇怪。
此处:Type Traits - Explicit template specialization. fails on xcode
在这里:C++ template specialization
它的编写,成员函数模板专业化必须在类之外,但在同一名称空间中(是的,如果模板专门化在类中,gcc 4.1.x版本失败并出现错误。)
所以,如果我在类下面移动成员函数模板特化,在同一个命名空间中,那么msvc-2010编译器认为我定义了两次:我有编译器错误:
错误LNK1169:找到一个或多个多重定义的符号
错误LNK2005,详细描述了两次定义。
如果我将同一名称空间下的模板专精化移动到cpp
文件中,那么msvc-2010就不会看到它,并且在尝试对特殊参数使用默认模板函数时会出现多个错误:
错误C2678:二进制'>>' :没有找到左手的操作员 类型' std :: istringstream'的操作数(或者没有可接受的 转化率)
(发生错误是因为它试图将运算符>>调用为const char指针)
所以,msvc-2010适用于我,当模板专业化在类中时,但gcc-4.1.x不起作用。
最后,我应该在哪里放置模板专业化,以便能够在两个编译器中编译它?
该标题:
#include <iostream>
#include <sstream>
#include <string>
class MyMap
{
public:
template<typename T>
T getValue(std::string phrase, T def)
{
std::istringstream ss(phrase);
T ret;
ss >> ret;
if(ss.fail() || !ss.eof())
return def;
else
return ret;
}
这种专业化(来自cpp,但我不知道它必须在哪里):
template<>
std::string MyMap::getValue(std::string phrase, std::string def)
{
return phrase;
}
template<>
const char* MyMap::getValue(std::string phrase, const char* def)
{
return phrase.c_str();
}
string
和const char*
的专精(当ss >> ret;
为ret
指针时,完全避免const char
。)
示例非常简化。
答案 0 :(得分:3)
您可以将它放在类定义之外的标题中,如下所示:
template<>
inline std::string MyMap::getValue<std::string>(std::string phrase, std::string def)
{
return phrase;
}
template<>
inline const char* MyMap::getValue<const char*>(std::string phrase, const char* def)
{
return phrase.c_str();
}
或者使用您希望它拥有的参数集声明常规方法,并像往常一样在.cpp
中定义它:
·H
class MyMap
{
// ...
std::string getValue(std::string phrase, std::string def);
const char* getValue(std::string phrase, const char* def);
}
的.cpp
std::string MyMap::getValue(std::string phrase, std::string def)
{
return phrase;
}
const char* MyMap::getValue(std::string phrase, const char* def)
{
return phrase.c_str();
}