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>();