作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如何特化具有参数常量引用的可变参数模板函数?
例子:
template<typename T, typename... Args>
T foo(Args... args) = delete;
template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile
//template<> int foo(int a, const char* str, Test ) { .... } // Ok
int main() {
auto i = foo<int>(10, "test string!", t);
return 0;
}
当使用声明的 const Test&
参数调用函数 foo 时,编译器无法看到专门的函数并回退到已删除的函数:
error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’
auto i = foo<int>(10, "test string!", t);
如果我从参数中删除 const 引用,上面的代码编译得很好。我做错了什么?
可以查到代码here
最佳答案
这是因为主模板为您的调用推导的模板参数是 int
、const char*
和 Test
,而不是 常量测试&
。这意味着您的特化未被使用,因为模板参数与参数不匹配。
最简单的选择是提供单独的重载而不是特化:
template <typename T>
T foo(int a, const char* str, const Test& t) { /*...*/; }
关于c++ - 具有 const 引用的可变参数模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42853876/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!