C++ 类型为的模板参数,该参数由来自其他模板类的内部typedef定义 #包括 结构A { boolf(inta){std::cout
我目前的猜测是ibmxlc和suncc都有bugC++ 类型为的模板参数,该参数由来自其他模板类的内部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
在模板参数上下文中使用
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;
}