我SFINAE代码使用std::enable_if
编译在GCC &铛,但不是在2013年MSVCMSVC 2013 '类型':不是“STD成员:: enable_if <false,void>
#include <iostream>
#include <type_traits>
template <typename T, typename ... AdditionalInputs>
typename std::enable_if<sizeof...(AdditionalInputs) == 0, void>::type
CallDoDataProcessing(T var) {
std::cout << sizeof...(AdditionalInputs) << " additional inputs" << std::endl;
}
template <typename T, typename ... AdditionalInputs>
typename std::enable_if<sizeof...(AdditionalInputs) == 1, void>::type
CallDoDataProcessing(T var) {
std::cout << sizeof...(AdditionalInputs) << " additional inputs" << std::endl;
}
int main() {
CallDoDataProcessing<int>(3);
CallDoDataProcessing<int, int>(3);
return 0;
}
在GCC /铛,这个完美的作品,在MSVC不过,我得到:
Error 1 error C2039: 'type' : is not a member of 'std::enable_if<false,void>' c:\Users\mrussell\documents\visual studio 2013\Projects\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.cpp 5 1 ConsoleApplication1
的编译和运行输出应为:
0 additional inputs
1 additional inputs
我在SO上看到过一些类似的问题,但没有一个有明确的答案,或者是略微正切的。
读MSVC enable_if页面,这应该工作...
如何使用SFINAE在MSVC2013?
UPDATE
正如一个音符,这确实在积极的情况下工作。例如,如果我注释掉第一个函数和对它的调用,那么其余的就会编译。即在CallDoDataProcessing
上的enable_if<true, void>
确实具有type
成员。
然而,注释掉第二个函数并调用它(所以,留下的版本,其中sizeof...(AdditionalInputs) == 0
不工作,虽然,同样的错误。
这表明sizeof...(AdditionalInputs) == 0
呼叫没有被匹配,但我可以”牛逼弄清楚为什么它不会。
你是否#include'? –
AndyG
@AndyG从来没有想到这一点,我只是试过,但似乎没有什么区别。我将修改上面的代码以显示包含的内容。 – Matt
我的第一个猜测是你需要更新MSVC –