c++ - 解决 VC++12 中的模板特化错误?

标签 c++ visual-studio c++11 visual-studio-2013

我有一些为 Clang 3.2 编写的代码,我正试图将其移植到 VC++12 中运行。 Clang 3.2+ 和 GCC 4.8 没有问题,但 VC++12 有问题。这是产生问题的最小片段:

template <int(*ptr)()>
class foo {};

template<int N>
int ReturnsN() { return N; }

template<int N>
class bar {
  typedef foo<ReturnsN<N>> fooN; 
};

现在我很确定这是一个编译器错误(但如果不是,请告诉我!)给出的错误是:

'specialization' : cannot convert from 'int (__cdecl *)(void)' to 'int (__cdecl *)(void)'

那么有人知道一个体面的工作吗?编译器似乎确信专用函数未完全定义。

编辑:我还应该指出,我已经使用标准编译器和 2013 年 11 月的 CTP 进行了尝试。两者都有同样的问题。

最佳答案

一个糟糕的解决方法,我建议您向 connect 提交错误报告:

template < int (*)() >
class foo {};

template<int N>
int ReturnsN( ) { return N; }

template<int N>
class bar {
    static int myReturnsN() { return ReturnsN<N>; }
    using fooN = foo< myReturnsN >;
};

关于c++ - 解决 VC++12 中的模板特化错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21638907/

相关文章:

c++ - 清除和删除多精度变量

c++ 11 - 实现 Promise 的示例程序不起作用

visual-studio - 00 :15:00 minutes because of Testimpact 之后的构建超时

c++ - C++ 11 中的正则表达式

c++ - 将 unique_ptr 添加到 vector 中的类会导致 3 倍 boost

c++ - void * 到运行时 std::tuple 的第 n 个元素

c++ - 我们可以在 C++14 中省略 std::array 的双括号吗?

c++ - 如何从 void* 测试类

c# - 类库 - 引用 - 复制本地的可重用性?

c# - 将字符串数字转换为整数