当模板化函数调用以特定方式链接时,代码将无法使用G ++ 4.7.3进行编译

时间:2014-02-23 03:58:52

标签: c++ templates g++

请注意,我可以简单地绕过这个问题,我只是好奇为什么会发生这种情况。

我试图在另一个模板化函数的返回值上调用模板化函数,所有函数都在模板化函数中。我用模板化对象作为模板参数调用模板化函数。模板化对象使用外部模板参数定义。

#include <string>

class Class
{
public:
    static Class& define( std::string name ) {
        return *new Class();
    }

    template<typename C, typename... Args>
    Class& constructor() {
        // .. Add the constructor...
        return *this;   
    }
};


template<typename T>
class iVector {
    T x; T y;
    iVector() : x( 0 ), y( 0 ) {}
    iVector( T x, T y ) : x( x ), y( y ) {}
};


typedef iVector<int> Vector;


Class& registerVector( std::string name ) {
    // This works as expected.
    Class& c = Class::define( name )
        .constructor< Vector >()
        .constructor< Vector, int, int >();
    return c;
}

// Outer templated function.
template<typename T>
Class& registerVector( std::string name ) {
    Class& c = Class::define( name )
        .constructor< iVector<T> >( )
        // This however throws a compiler error
        .constructor< iVector<T>, T, T >();
    return c;
}

int main() {
    registerVector( "Vector" );
    registerVector< iVector<int> >( "Vector" );
}

问题似乎只发生在两个函数链接在一起时,并且作为函数模板参数传递的类型使用外部函数模板类型。为什么会这样?这是GCC的错误吗? GCC错误:

TempTest.cpp: In function ‘Class& registerVector(std::string)’:
TempTest.cpp:46:27: error: expected primary-expression before ‘,’ token
TempTest.cpp:46:29: error: declaration of ‘Class T’
TempTest.cpp:41:10: error:  shadows template parm ‘class T’
TempTest.cpp:46:34: error: expected initializer before ‘>’ token

1 个答案:

答案 0 :(得分:6)

由于这些函数是在模板中调用的,因此您需要使用template关键字将其歧义为对函数模板的调用:

Class& c = Class::define( name )
        .template constructor< iVector<T> >()
        .template constructor< iVector<T>, T, T >();

有关详细信息,请参阅this FAQ