提供以下代码:
#include <string>
template<typename T>
static void parse(T & result)
{
if (std::is_same<T, struct Foo>::value)
{
result.fooValue = 123;
}
else if (std::is_same<T, struct Bar>::value)
{
result.barValue = 456;
}
}
struct Foo { int fooValue; };
struct Bar { int barValue; };
int main()
{
Foo foo;
parse(foo);
Bar bar;
parse(bar);
return 0;
}
这不会编译并显示错误消息:
error C2039: 'barValue': is not a member of 'Foo'
error C2039: 'fooValue': is not a member of 'Bar'
我在做什么错?有人可以向我解释为什么在将foo
传递到parse
并传递bar
之后为什么会认为它是foo
并因此引发编译器错误的原因。这背后的常识是什么?换句话说,检查模板类型的正确原因是什么?
请注意,我已经了解模板专门化和实例化。
谢谢!
答案 0 :(得分:5)
实例化模板时,两个分支都需要编译。显然,其中之一不能-特定的模板类型只有一个成员,而没有另一个成员。
要解决此问题,您可能需要C ++ 17中的constexpr if
,或者在以前的版本中使用标签分发或SFINAE。