模板专业化适用于gcc,但不适用于visual studio 10

时间:2013-09-10 15:12:08

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

我的代码中有这个模板专门化,当我使用gcc编译它时工作得非常好,但是当我使用Visual Studio 10的编译器编译它时却没有:

Field.cpp

template<>
void Field<std::string>::setValueString(const std::string &val)
{
  operator=(val);
}

template<>
void Field<bool>::setValueString(const std::string &val)
{
  bool v = static_cast<bool>(atoi(val.c_str()));
  operator=(v);
}

template<>
void Field<int32_t>::setValueString(const std::string &val)
{
  int intv = atoi(val.c_str());
  operator=(intv);
}

template<>
void Field<int16_t>::setValueString(const std::string &val)
{
  int intv = atoi(val.c_str());
  operator=(intv);
}

Field.hpp

template<typename FieldType>
class Field : public FieldBase
{
public:
  Field(const std::string &fieldName)
    : FieldBase(fieldName), _overriddenInsertValue(this) {}
  ~Field() {}

  (...)

  /**
   * @brief Template specialized for every available field type in Model.cpp
   */
  void setValueString(const std::string &)
  {
    ALT_ERROR("Field::setValueString called with wrong argument type.");
  }
};

在Windows上由于某种原因我总是在错误的情况下结束,但我不明白为什么,因为当我使用gcc在linux / mac os上运行它时它工作正常。

2 个答案:

答案 0 :(得分:3)

如果您要在.cpp文件中定义模板专精,您仍然必须在头文件中声明所有模板专精

template<> void Field<std::string>::setValueString(const std::string &val);
template<> void Field<bool>::setValueString(const std::string &val);
template<> void Field<int32_t>::setValueString(const std::string &val);
template<> void Field<int16_t>::setValueString(const std::string &val);

上述声明必须出现在头文件中。我在你的代码中没有看到它们。

你不能只在一些.cpp文件中专门化模板,然后期望编译器以某种方式在所有其他翻译单元中神奇地了解它。这就是头文件中的声明的用途。

答案 1 :(得分:0)

我认为要正确地专门化Field.cpp中函数的实现,你需要首先在Field.hpp中声明函数。

要专注于您需要的类型:

template<>
class Field <int32_t> : public FieldBase
{
public:
  ... rest of the functions
  void setValueString(const std::string &);
};

希望这有帮助, Raxvan。