双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

求助gcc 7.5.0模板内调用模板编译报错

mounmory mounmory 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

最近写了个代码,需求是定义一个类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>报错了。

 

...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部
mounmory
疑难问题 22,298 成员 121,727 内容