【问题标题】:Too few template-parameter-lists problem模板参数列表太少的问题
【发布时间】:2011-05-17 10:10:10
【问题描述】:

谁能告诉我如何使以下伪代码与 GCC4 兼容?我想知道它在 MSVC 下是如何工作的...

typedef int TypeA;
typedef float TypeB;

class MyClass
{
// No base template function, only partially specialized functions...
    inline TypeA myFunction<TypeA>(int a, int b) {} //error: Too few template-parameter-lists
    template<> inline TypeB myFunction<TypeB>(int a, int b) {}
};

【问题讨论】:

    标签: c++ templates visual-c++ gcc partial-specialization


    【解决方案1】:

    对该构造进行编码的正确方法是:

    typedef int TypeA;
    typedef float TypeB;
    class MyClass
    {
        template <typename T> 
        T myFunction( int a, int b );
    };
    template <> 
    inline TypeA MyClass::myFunction<TypeA>(int a, int b) {}
    template <> 
    inline TypeB MyClass::myFunction<TypeB>(int a, int b) {}
    

    请注意,模板成员函数必须在类声明声明,但特化必须在其在命名空间级别定义。

    【讨论】:

    • @Ryan:只要从未使用过,就不需要实现它。如果某些代码尝试使用doubleint 以外的模板参数调用该函数,它将编译(存在声明)但将无法链接(非专用模板没有定义)。此外,由于只有两种实例化类型,您可以将特化移动到单个翻译单元并手动实例化它们(不要忘记在函数中添加注释,以便其他人知道您只能使用该模板与两种类型!)
    • 感谢您的澄清,大卫!很抱歉问了这么多,但你能告诉我,在模板函数的情况下如何解决这种问题?如果我在全局命名空间中定义了一个模板函数和几个专门的函数,我会得到“实例化后...的特殊化”错误...
    • 该错误意味着函数模板已经在编译器处理特化的地方被实例化。您可能可以通过移动代码来解决它,以便模板声明和特化在使用模板之前放在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多