【问题标题】:Having trouble with template classes having template member functions具有模板成员函数的模板类遇到问题
【发布时间】:2012-10-20 13:49:23
【问题描述】:

在我对模板的实验中,我遇到了一个令人困惑的困境。我正在定义一个模板结构F,其默认参数是int。它有一个模板化的成员函数g。我在结构定义下面定义它。我认为这是正确的方法,但是,我收到一个错误。只有一个错误:

prog.cpp:9:62: 错误:包含 'void F::g()' 的类的模板参数的默认参数

template <typename = int> struct F {

    template <typename> void g();

};

template <typename T = int> template <typename> void F<T>::g() {}

int main() {

    F<>f;

}

这很模糊。我无法完全理解它的意思。所以我试着改变一些东西。我认为这是F 定义的默认模板参数。所以我改变了:

template <typename = int> struct F {

template <typename T = int> struct F {

我也试过给g模板参数:

template <typename T = int> template <typename U> void F<T>::g<U>() {}

但后来我收到了错误:

prog.cpp:9:67: 错误:不允许函数模板部分特化“g”
prog.cpp:9:67:错误:包含“void F::g()”的类的模板参数的默认参数

我什至尝试指定 g 是一个模板函数:

template <typename T = int> template <typename U> void F<T>::template g<U>() {}

但这没有帮助。我做错了什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    默认模板参数只能用于函数声明,不能用于定义:

    template <typename T/* = int*/> template <typename> void F<T>::g() {}
    

    【讨论】:

    • 与函数实参默认参数一致。
    • 但是……默认参数确实出现在定义中,即F的定义中。更不用说函数默认参数的规则比模板默认参数的规则更宽松。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2010-12-22
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多