2

我有一个模板类 CFoo 使用以下类型

enum My_Types {t1,t2};

具有由

template<My_Types T>
class CFoo
{
    public:
    CFoo()
    {
        std::cerr<<"ERROR:....";
        exit(1);
    }
};

template<>
class CFoo<t1>
{
    ....
};

另外我有一个使用 CFoo 对象作为参数的函数

template<class T>
void foo1 ( const T &CfooObj,...);

现在我需要一个指向 foo1 的指针,所以我必须指定模板参数

void (*foo1_pointer) ( const CFoo< t1 >&,...);

但以下似乎不正确(“没有匹配转换函数 foo1...”):

foo1_pointer=&foo1;

如何正确传递这个模板函数的指针?

4

3 回答 3

1

这可能是由于您的 GCC 编译器的旧版本。此代码在 GCC 4.7.2、Clang 3.2、ICC 13.0.1 和 VS10 上编译良好:

#include <iostream>

enum My_Types {t1,t2};

template<My_Types T>
class CFoo { /* ... */ };

template<> class CFoo<t1> { /* ... */ };

template<class T>
void foo1 (const T &, ...) { /* ... */ }

int main()
{
    void (*foo1_pointer) (const CFoo< t1 >&, ...);
    foo1_pointer = &foo1;
}

foo1当从分配给它的函数指针的类型中获取其地址时,编译器应该能够推断出模板参数。根据 C++11 标准的第 14.8.2.3/1 段:

模板参数可以从获取重载函数(13.4)地址时指定的类型推导出来。函数模板的函数类型和指定类型作为P和A的类型,推导如14.8.2.5所述。

此外,根据第 13.4/1 段:

A use of an overloaded function name without arguments is resolved in certain contexts to a function, a pointer to function or a pointer to member function for a specific function from the overload set. A function template name is considered to name a set of overloaded functions in such contexts. The function selected is the one whose type is identical to the function type of the target type required in the context. [...]

于 2013-02-18T21:33:58.617 回答
0

你可以只写foo1<CFoo<t1>>。或者只是foo1(适用于 g++ 4.7.2)。

于 2013-02-18T21:30:44.080 回答
0

作业应该是这样的:

foo1_pointer = &foo1<CFoo<t1>>;
于 2013-02-18T21:32:26.183 回答