Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型为的模板参数,该参数由来自其他模板类的内部typedef定义 #包括 结构A { boolf(inta){std::cout_C++_Templates_Typedef - Fatal编程技术网

C++ 类型为的模板参数,该参数由来自其他模板类的内部typedef定义 #包括 结构A { boolf(inta){std::cout

C++ 类型为的模板参数,该参数由来自其他模板类的内部typedef定义 #包括 结构A { boolf(inta){std::cout,c++,templates,typedef,C++,Templates,Typedef,我目前的猜测是ibmxlc和suncc都有bug 在模板参数上下文中使用typename可能会混淆给出错误的版本,但用于指示从属名称是一种类型,而不是引入类型参数。请注意,这些编译器不一致,不要求typename指示从属名称是一种类型在其他需要它的环境中(甚至对于代码编译的Sun CC版本)。我目前的猜测是IBM xlC和Sun CC都有bug 在模板参数上下文中使用typename可能会混淆给出错误的版本,但用于指示从属名称是一种类型,而不是引入类型参数。请注意,这些编译器不一致,不要求typ

我目前的猜测是ibmxlc和suncc都有bug


在模板参数上下文中使用
typename
可能会混淆给出错误的版本,但用于指示从属名称是一种类型,而不是引入类型参数。请注意,这些编译器不一致,不要求
typename
指示从属名称是一种类型在其他需要它的环境中(甚至对于代码编译的Sun CC版本)。

我目前的猜测是IBM xlC和Sun CC都有bug


在模板参数上下文中使用
typename
可能会混淆给出错误的版本,但用于指示从属名称是一种类型,而不是引入类型参数。请注意,这些编译器不一致,不要求
typename
指示从属名称是一种类型在其他需要它的上下文中(甚至对于代码编译的Sun CC版本).

我觉得你的示例还可以。你遇到了什么错误,你使用的是什么编译器?+1发布了一个完整的可编译示例和一个明确的问题。你的代码为我编译并工作。从Ideone,当使用IBM编译器编译时,我得到
非类型模板参数不能有类型“bool(float,float)”.
和Sun CC编译器中的类似内容。@elmo,Sun CC中可能有一个bug。早期版本给出编译错误,后来输出“int\nint”。查看代码,我发现没有任何理由不显示“int\nfloat”的bug/不受支持的功能除外这就是我用g++得到的结果。@elmo,在Ideone上,你没有使用相同的代码。缺少一个参数名F,你传递了两次tmp。你的示例在我看来还行。你得到了什么错误,你使用了什么编译器?+1发布了一个完整的可编译示例和一个明确的问题。你的代码为我编译并工作。来自Ideone,使用IBM编译器编译时,我得到的
非类型模板参数不能具有类型“bool(float,float)”。
和Sun CC编译器中类似的内容。@elmo,Sun CC中可能存在错误。早期版本给出编译错误,后一版本输出“int\nin”。查看代码,我发现没有理由不显示“int\n loat”,这是我使用g++时得到的。在Ideone上@elmo,您没有使用相同的代码。缺少一个参数名F,并且您传递了两次tmp。
#include <iostream>

struct A
{
    bool f( int a ) { std::cout << "int" << std::endl; return true;};
    bool f( int a, int b ) { std::cout << "two int" << std::endl; return true;};
    bool f( float a ) {std::cout << "float" << std::endl; return true;};
    bool f( float a, float b ) {std::cout << "two float" << std::endl; return true;};
};

template <typename T>
struct Type
{
    typedef bool (A::*One)(T);
    typedef bool (A::*Two)(T, T);
};

template <typename T, typename Type<T>::One F >
void run(A & a)
{
    T tmp = 0;
    (a.*F)(tmp);
}


int main(int argc, char ** argv )
{
    A a;
    run<int, &A::f>(a);
    run<float, &A::f>(a);

    return 0;
}