C++ 模板:模板函数不能很好地与类';s模板成员函数
这是我实际拥有的一些代码的最小测试用例。当它尝试计算C++ 模板:模板函数不能很好地与类';s模板成员函数,c++,templates,C++,Templates,这是我实际拥有的一些代码的最小测试用例。当它尝试计算a.getResult()时失败: 代码是: #include <iostream> template< class A, class B> void printStuff( const A& a) { size_t value = a.getResult<B>(); std::cout << value << std::endl; } struct Fir
a.getResult()
时失败:
代码是:
#include <iostream>
template< class A, class B>
void printStuff( const A& a)
{
size_t value = a.getResult<B>();
std::cout << value << std::endl;
}
struct Firstclass {
template< class X >
size_t getResult() const {
X someInstance;
return sizeof(someInstance);
}
};
int main(int, char**) {
Firstclass foo;
printStuff<Firstclass, short int>(foo);
printStuff<Firstclass, double>(foo);
std::cout << foo.getResult< double >() << std::endl;
return 0;
}
#包括
模板
无效打印材料(常数A和A)
{
size_t value=a.getResult();
std::cout当您引用作为依赖类型成员的模板时,必须在其前面加上关键字template
。这就是getResult
内部printStuff
调用的外观
size_t value = a.template getResult<B>();
size\u t value=a.template getResult();
这类似于在引用依赖类型中的嵌套类型名时使用关键字typename
。出于某种原因,关于嵌套类型的typename
的部分是众所周知的,但是对于嵌套模板的template
的类似要求相对未知
注意,一般语法结构有点不同。<>代码>类型名总是放在类型的全名前面,而<代码>模板<代码>插入在中间。
同样,这仅在访问依赖类型的模板成员时才有必要,在上面的示例中,printStuff
中的a
。在main
中调用foo.getResult
时,foo
的类型是不依赖的,因此不需要包含template
关键字 > P>贵公司代码根据C++标准14.2/4:格式不正确。
当成员模板专用化的名称出现在后缀表达式中的
或->
之后,或在限定id中的嵌套名称说明符之后,并且后缀表达式或限定id显式依赖于模板参数时(14.6.2),成员模板名称必须以关键字template
作为前缀。否则,该名称将假定为非模板名称
>,你应该写代码> siZixtvalue=.AdvestGETRESUTHORE();< /Cord>< /P>谢谢!这是我在C++中见过的最奇怪的语法。不知怎么说,VC++是非常宽松的(也就是说,你经常可以不用它)但是GCC绝对不是!完全同意你们三个点的意见,除非我发现GCC也要宽大,直到CodeSourcery.wow和ARM交叉编译,我想我也知道C++语法的所有内容。我已经写了C++前端,我不知道这个。
size_t value = a.template getResult<B>();