为什么需要在此C ++模板中指定类型?

时间:2014-10-12 20:52:21

标签: c++ templates

我有一个C ++代码的这个极小的,人为的例子,带有一个默认类型参数的模板结构:

#include <iostream>
using namespace std;

template <class T=int>
struct AddsFourtyTwo {
    template <class U>
    static U do_it(U u) {
        return u + static_cast<T>(42);
    }
};

int main() {
    double d = 1.24;
    std::cout << AddsFourtyTwo::do_it(d) << std::endl;
}

当我尝试编译此代码时,我在g ++ 4.9.1中遇到以下错误:

$ g++ test.cpp
test.cpp: In function 'int main()':
test.cpp:14:18: error: 'template<class T> struct AddsFourtyTwo' used without template parameters
     std::cout << AddsFourtyTwo::do_it(d) << std::endl;
                  ^

如果我为T指定int,那么它会编译并产生预期的输出(43.24)。我的问题是,为什么这有必要呢?如果你需要指定类型,那么默认类型参数在AddsFourtyTwo的定义中做了什么?

2 个答案:

答案 0 :(得分:7)

您不需要指定类型,但语言不允许使用模板作为实际类型而不指定某些参数列表:

std::cout << AddsFourtyTwo<>::do_it(d) << std::endl;

答案 1 :(得分:1)

使用模板类需要以下语法:

std::cout << AddsFourtyTwo<>::do_it(d) << std::endl;

将编译并使用默认参数。这是令人困惑的,因为模板化方法不需要相同。