gpt4 book ai didi

c++ - 编译器将(不相关的)模板的名称与方法名称混淆

转载 作者:行者123 更新时间:2023-11-30 00:49:01 25 4
gpt4 key购买 nike

我在下面的代码中有一个编译错误。编译器似乎将类方法 set 解释为一个模板,乍一看,它与我的代码完全无关。

#include <cassert>
#include <limits>

using namespace std;

template <class T>
class ReduceScalar{

public:
T get() { return *r; };
void set(T t) { *r = t; };
void set(T* t) { r = t; };

private:
T* r;

};

template <class T>
class ReduceSum : public ReduceScalar<T>
{
public:
ReduceSum(T* target) { set(target); set(0); } // COMPILE ERROR


};

编译器报如下错误:

../test/../io/scalarreducers.h:34:26: error: use of class template 'set' requires template arguments
ReduceSum(T* target) { set(target); set(0); }

但我认为这是因为它认为 set 是一个模板:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree:685:71: note: template is declared here
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY set;

我不明白为什么编译器会尝试为方法 set 实例化该模板,而不仅仅是调用方法 set。我该如何解决这个名称混淆问题?

最佳答案

即使你摆脱了那个讨厌的东西,你仍然会有问题using namespace std .问题是成员函数 set可能不存在于所有实例中。问题中的代码使用set作为一个不合格的、非依赖的名称。这意味着两件事:

  • 编译器会尝试解析set在定义模板的位置。
  • 编译器不会查看基类ReduceScalar<T>对于成员函数 set .不能,因为该成员可能不存在于所有实例化中。

最终结果:代码无法编译。解决方案是将该非依赖名称转换为依赖名称。这将依赖名称的解析推迟到模板实例化之前。一种方法是明确使用 this (这是一个从属名称)。

template <class T>
class ReduceSum : public ReduceScalar<T>
{
public:
ReduceSum(T* target) { this->set(target); }
};

或者,您可以使用 using 声明(与 using 指令非常不同):

template <class T>
class ReduceSum : public ReduceScalar<T>
{
public:
using ReduceScalar<T>::set;
ReduceSum(T* target) { set(target); }
};

关于c++ - 编译器将(不相关的)模板的名称与方法名称混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29992418/

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