繁体   English   中英

为什么我不能将模板参数传递给另一个模板?

[英]Why can't I pass template parameters on to another template?

好的,我将举一个简单的问题示例:

void Increment(Tuple<int, int>& tuple) {
    ++tuple.Get<0>();
}

int main() {

    Tuple<int, int> tuple;

    tuple.Get<0>() = 8;

    Increment(tuple);

    printf("%i\n", tuple.Get<0>()); // prints 9, as expected

    return 0;

}

编译得很好,一切都很好。 Increment函数只增加元组中的第一个元素,然后我打印该元素。 但是,如果我的Increment函数可用于任何类型的元素,那不是很好吗?

template <typename T>
void Increment(Tuple<T, T>& tuple) {
    ++tuple.Get<0>(); // <-- compile ERROR
}

int main() {

    Tuple<int, int> tuple;

    tuple.Get<0>() = 8;

    Increment<int>(tuple);

    printf("%i\n", tuple.Get<0>());

    return 0;

}

我的第二个例子在编译时吐出以下错误:

error: expected primary-expression before ')' token

我最终在试图找出导致问题的原因。 由于模板参数为'int',因此生成的代码应我的硬编码示例相同 我怎样才能让它发挥作用?

它应该是:

++tuple.template Get<0>();

以同样的方式,您需要typename来指定从依赖类型限定的类型,您需要template来指定从依赖类型限定的模板函数。

由于GMan已经为您提供了正确的答案 ,您仍然可以做的一件事是:您可以简单地编写Increment(tuple)而不是Increment<int>(tuple) (后一种语法看起来有点复杂)。 编译器有足够的智能来推断函数模板类型类型 tuple

见: http//www.ideone.com/juNOg

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM