1

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

字段.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);
}

字段.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 上运行它时它工作正常。

4

2 回答 2

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文件中专门化模板,然后期望编译器以某种方式神奇地在所有其他翻译单元中了解它。这就是头文件中的声明的用途。

于 2013-09-10T15:31:26.790 回答
0

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

要专注于一种类型,您需要这样的东西:

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

希望这会有所帮助,拉克斯万。

于 2013-09-10T15:22:21.647 回答