gpt4 book ai didi

c++ - g++模板参数错误

转载 作者:IT老高 更新时间:2023-10-28 22:16:01 25 4
gpt4 key购买 nike

我有如下 GetContainer() 函数。

template<typename I,typename T,typename Container>
Container& ObjCollection<I,T,Container>::GetContainer()
{
return mContainer;
}

当我如下使用这个方法时

template<typename I,typename T>
T& DynamicObjCollection<I,T>::Insert(T& t)
{
GetContainer().insert(&t);
return t;
}

我遇到了错误。

error: there are no arguments to ‘GetContainer’ that depend on a template parameter, 
so a declaration of ‘GetContainer’ must be available

error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of
an undeclared name is deprecated)

它在 MSVC 上运行良好,但 g++ 不是那么宽松。代码有什么问题?

最佳答案

我注意到 GetContainer 函数是 ObjCollection 的方法,而 InsertDynamicObjectCollection 的成员.由此,我将假设 DynamicObjectCollection 继承自 ObjectCollection

如果确实如此,那么问题是当你编写一个从模板基类继承的模板类时,名称查找的工作方式与普通类中的名称查找略有不同。特别是,您不能只使用名​​称来引用基类成员;您需要向编译器指明在哪里查找名称。这在 Visual Studio 中有效的原因是 Microsoft C++ 编译器实际上错误地处理了这种行为,并允许在技术上非法的代码编译得很好。

如果要调用基类的GetContainer 函数,有两种选择。首先,您可以明确指出该调用是对成员函数的:

this->GetContainer().insert(&t);

现在编译器知道 GetContainerDynamicObjectCollection 的成员,它知道它可能需要在基中查找 GetContainer类,因此它将推迟名称查找,直到模板被实例化。

另一个可用的选项是在类主体中添加 using 声明:

template <typename I, typename T>
class DynamicObjectCollection: public ObjectCollection<I, T, /* ? */> {
public:
using ObjectCollection<I, T, /* ? */>::GetContainer;

/* ... */
};

这也明确地向编译器表明 GetContainer 可以在基类中定义,因此它将查找推迟到模板实例化。

如果这不适用于您的情况,请告诉我,我可以删除此帖子。

希望这会有所帮助!

关于c++ - g++模板参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5286922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com