求助gcc 7.5.0模板内调用模板编译报错
最近写了个代码,需求是定义一个类A,有一个模板函数,又定义了一个模板类B,B中也定义了一个模板函数。
将A作为B的模板参数进行实例化,在B的模板函数中调用A的模板函数,ubuntu18.04中的GCC 7.5.0报错(在VS2015、VS2019编译都没问题,ubuntu16.04中的GCC 5.4.0也没问题),求大神帮忙解决下?
代码如下
#include <iostream>
#include <string>
#include <utility> // for std::pair
// 类A的定义
class A {
public:
// 模板成员函数
template<typename T>
void Set(T value) {
std::cout << "A::Set called with value: " << value << std::endl;
}
// 模板成员函数,返回一个默认构造的T
template<typename T>
T Get() {
std::cout << "A::Get called, returning default-constructed T" << std::endl;
return T();
}
};
// 模板类B的定义
template<typename TA>
class B {
private:
TA a_instance; // A的实例作为B的成员
public:
// 模板成员函数
template<typename T>
void Set(T value) {
std::cout << "B::Set called with value: " << value << std::endl;
a_instance.Set<T>(value);
//a_instance.Set(value);//去掉显示模板调用可以编译
}
// 模板成员函数,返回一个默认构造的T
template<typename T>
T Get() {
std::cout << "B::Get called, calling A::funcA and returning its result" << std::endl;
// 调用A的模板成员函数并返回其结果
return a_instance.Get<T>();
//return a_instance.Get();//去掉显示模板调用,会报错类型退到错误
}
};
int main() {
// 创建B<A>的对象,即B的模板参数为A
B<A> b;
int int_value = b.Get<int>();
std::string strSet = "set string";
b.Set<std::string>(strSet);
return 0;
}
报错如下:

像是模板在没有实例化时,没有检查到调用的A函数也是模板函数,到A的函数模板参数<T>报错了。
相关推荐
Ubuntu下gcc-7.5.0安装完整依赖.zip
升级本地gcc版本所需安装包详情如下: gcc-7.5.0.tar.gz gmp-6.1.0.tar.bz2 mpc-1.0.3.tar.gz mpfr-3.1.4.tar.bz2 isl-0.16.1.tar.bz2
CentOS 7下安装gcc 9.3.0
目录CentOS 7下安装gcc 9.3.0安装gcc安装bzip2下载gcc-9.3.0.tar.gz解压gcc-9.3.0.tar.gz安装gcc-9.3.0查看gcc版本注意事项 CentOS 7下安装gcc 9.3.0 本文主要介绍怎么在CentOS 7环境下安装GCC 9.3.0,适用于部分源码包需要高版本的gcc进行编译的场景,需要准备的环境有: CentOS 7 gcc-9.3.0.tar.gz 安装gcc 使用下面命令安装gcc、gcc-c++,若已安装则忽略此步骤 yum install -y gcc gcc-c++ 安装bzip2 使用以下命令安装bzip2,主要用于之
Keil5配置GCC编译器_Keil5配置GCC编译器_
Keil5配置GCC编译器文档,Keil一般使用ARMCC编译MCU工程代码。
Keil5配置GCC编译器编译STM32工程示例
Keil5配置GCC编译器编译STM32工程,具体配置可以参考我的博客http://my.csdn.net/weixin_39871788
arm-linux-gcc-5.4.0交叉编译工具.rar
找了好久才找到的这个,以前使用低版本的arm-linux-gcc交叉编译工具时,编译QT出错,这里找了arm-linux-gcc-5.4.0,放在这里存下


疑难问题

