我的代码中有这个模板专门化,当我使用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上运行它时它工作正常。
答案 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。