c++ - 嵌套 C++ 模板的一个例子

标签 c++ templates gcc

<分区>

这段代码在VS2013中可以正常运行,输出:
你好,133
你好,233
,但是在 code::blocks(使用 GCC 编译器和 Ubuntu 系统)中,编译器告诉我:

||=== 构建:在 test_sth 中调试(编译器:GNU GCC 编译器)===|
在成员函数‘void A::say()’中:
第 28 行错误:')' 标记之前的预期主表达式
在“void A::say() [with C = B]”的实例化中:
此处需要第 31 行
第 28 行错误:类型为“<未解析的重载函数类型>”和“int”的无效操作数为二进制“operator<”
||=== 构建失败:2 个错误,2 个警告(0 分钟,0 秒)===|

有没有人能告诉我哪里出了问题,为什么?

第 28 行是:this->c.Match<233>();
第 31 行是:template struct A< B < int >>;

#include "stdio.h"

using namespace std;

template<typename C>
struct A
{
    C c;
    void say();
};

template<typename C>
class B
{
    C name;
    public:
    template<int D>
    void Match()
    {
        printf("hello,%d\n",D);
    }
};

template<typename C>
void A<C>::say()
{
    this->c.Match<233>();
}

template struct A<B<int>>;

int main()
{
    A<B<int>> a1;
    a1.c.Match<133>();
    a1.say();
    getchar();
    return 0;
}

最佳答案

以下摘自http://www-01.ibm.com/support/knowledgecenter/SSQ2R2_8.0.3/com.ibm.xlcpp111.aix.doc/language_ref/keyword_template_qualifier.html :

使用关键字模板作为限定符来区分成员模板和其他实体。以下示例说明了何时必须使用模板作为限定符:

class A
{
  public:
    template<class T> T function_m() { };
};

template<class U> void function_n(U argument)
{
  char object_x = argument.function_m<char>();  // ill-formed
}

在这个例子中,变量 object_x 的定义是错误的。编译器假定符号 < 是一个小于运算符。为了让编译器识别模板函数调用,必须添加模板限定符:

char object_x = argument.template function_m<char>();

关于c++ - 嵌套 C++ 模板的一个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35389336/

相关文章:

c++ - 将 Crashpad 与 Windows Qt 应用程序集成

C++ 时间操作函数

html - Haml 继承模板

c++ - GCC linux 上最好的(即快速且小)是atomic_fetch_ptr 和atomic_set_ptr

c++ - 是否有 C++ 的在线名称解码器?

c++ - QT 4.3 在线程之间传递类指针

C++ 从模板迭代器创建 vector

c++ - 在 C++ 中编写通用堆栈类

c++ - 为什么 C++ 编译器会复制函数退出基本 block ?

c++ - Xcode 默认标志从何而来?