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

mounmory 2025-01-21 13:31:37

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

 

...全文
42 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

22,297

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧