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

时间:2010-12-30 10:34:33

标签: c++ templates parameters compilation

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

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',因此生成的代码应该与我的硬编码示例相同。我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:12)

应该是:

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

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

答案 1 :(得分:5)

由于GMan已经为您提供了正确的answer,您仍然可以做的一件事是:您只需编写Increment(tuple)而不是Increment<int>(tuple)(后一种语法看起来有点复杂)。编译器非常智能,可以从tuple类型推断出 function-template-type

请参阅:http://www.ideone.com/juNOg

相关问题