我基本上试图做与std::enable_if 相同的事情:参数与模板参数,但我无法编译我的代码。
我有一个简单的第一个版本,它的参数中有 std::enable_if 并且工作正常:
#include <iostream>
#include <type_traits>
template <typename T>
void foo(T t, typename std::enable_if< std::is_same<T, int>::value >::type* = 0) {
std::cout << "int" << std::endl;
}
template <typename T>
void foo(T t, typename std::enable_if< !std::is_same<T, int>::value >::type* = 0) {
std::cout << "not int" << std::endl;
}
int main(int argc, char* argv[])
{
foo(10);
foo(10.1);
return 0;
}
但是我认为如果模板内容在一个地方并且希望 enable_if 不在函数参数中,它可能会更简洁。
现在,如果我只是移动 enable_if 部分,我会得到以下信息:
#pragma warning(1 : 4519)
#include <iostream>
#include <type_traits>
template <typename T, typename std::enable_if< std::is_same<T, int>::value >::type = 0>
void foo(T t) {
std::cout << "int" << std::endl;
}
template <typename T, typename std::enable_if< !std::is_same<T, int>::value >::type = 0>
void foo(T t) {
std::cout << "not int" << std::endl;
}
int main(int argc, char* argv[])
{
foo(10);
foo(10.1);
return 0;
}
我需要 #pragma 警告(1 : 4519),否则函数模板上的默认参数是 VS2010 中的错误。问题是它仍然无法编译。第一条消息是:error C2783: 'void foo(T)' : could not deduce template argument for '__formal'
即使我不想这样做,我也尝试通过调用它来明确说明我想要的模板
foo<int, int>(10);
foo<double, double>(10.1);
但它仍然不起作用,新的错误是。
error C2975: 'foo' : invalid template argument for 'unnamed-parameter', expected compile-time constant expression
我希望有人能告诉我如何解决这个问题,当然欢迎所有对我的风格和我的代码可能存在的其他问题的评论。:)
额外的问题:有人知道为什么VS2010默认不允许函数模板上的默认参数吗?