【发布时间】:2013-09-10 15:12:08
【问题描述】:
我的代码中有这个模板专业化,当我用 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 上运行它时,它工作正常。
【问题讨论】:
-
错误到底是什么意思?
-
很遗憾,但如今(C++11 被广泛实施/使用,C++14 准备就绪)MSVC 并不是与 C++ 一起工作的最佳编译器之一。如果有人不同意,请阅读 VS2013 路线图:听起来很糟糕。
-
错误是我最终使用了默认的
SetValueString函数(“使用错误的参数类型调用”),而不是我应该使用的特殊情况。当我将专业化移动到头文件时,它终于可以正常工作了,这有多奇怪? -
@Damien T:将这些特化移动到头文件的唯一方法是使所有函数内联。同时,看起来在您的原始代码中您不想将它们内联。如果您不想使它们内联,那么它们必须在
.cpp文件中定义,否则您将出现链接器错误。同样,正如答案中所述,您可能只是忘记在代码的原始版本中声明您的专业化。
标签: c++ visual-studio-2010 templates gcc template-specialization