在哪里放置模板专业化

时间:2016-01-31 14:58:34

标签: c++ visual-studio-2010 templates gcc

我发现模板专业化的问题很奇怪。

此处: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();
}

stringconst char*的专精(当ss >> ret;ret指针时,完全避免const char。)

示例非常简化。

1 个答案:

答案 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();
}