C++ 使用部分模板实例化删除限定符

C++ 使用部分模板实例化删除限定符,c++,templates,c++98,C++,Templates,C++98,要实现接受回调函数和参数的接口 前 测试中的部分专门化删除了界面用户可能错误地传递到模板参数中的不需要的限定符 在实践中,我发现了一些我无法解释的错误。我希望有一双新的眼睛能够看到这种方法中的注意事项 我的一些条件是,我不能改变用户调用接口的方式,我使用的是2003年以来的旧标准。我认为,我目前调试的错误源于用户代码中使用的typename;可能将未解析的类型传递到add(),该类型也未解析,因此编译器无法找到与调用匹配的函数 编辑: 所以我遇到的“typename”问题是一个与问题无关的编码错

要实现接受回调函数和参数的接口

测试中的部分专门化删除了界面用户可能错误地传递到模板参数中的不需要的限定符

在实践中,我发现了一些我无法解释的错误。我希望有一双新的眼睛能够看到这种方法中的注意事项

我的一些条件是,我不能改变用户调用接口的方式,我使用的是2003年以来的旧标准。我认为,我目前调试的错误源于用户代码中使用的
typename
;可能将未解析的类型传递到
add()
,该类型也未解析,因此编译器无法找到与调用匹配的函数

编辑:

所以我遇到的“typename”问题是一个与问题无关的编码错误。此外,我发现删除
常量
说明符是不必要的,只需要删除
&


感谢您的回答。

标准已经为您提供了自己想要实现的内容;typedef提高了可读性:

class SomeInterface
{
    using ArgType
        = typename std::remove_const<std::remove_reference<T>::type>::type;
    void add(ArgType const& data);
};
类接口
{
使用ArgType
=typename std::remove_const::type;
无效添加(ArgType常量和数据);
};

要在旧的编译器中同时使用这两个选项,您可以从“可能的实现”部分复制–但是,我确实建议您更新到新的编译器(当然,如果可用)。

类定义末尾的分号在哪里?
template<class T_data_type>
struct No_qualifiers
{
  typedef T_data_type Type;
};

template<class T_data_type>
struct No_qualifiers<T_data_type&>
{
  typedef T_data_type Type;
};

template<class T_data_type>
struct No_qualifiers<const T_data_type>
{
  typedef T_data_type Type;
};

template<class T_data_type>
struct No_qualifiers<const T_data_type&>
{
  typedef T_data_type Type;
};

template<class T_class_type, class T_data_type>
class Some_interface
{
public:
  Some_interface(T_class_type* inst, void (T_class_type::*func)(T_data_type));
  void add(const typename No_qualifiers<T_data_type>::Type& data);
private:
  void call(const T_data_type& data);
};
class SomeInterface
{
    using ArgType
        = typename std::remove_const<std::remove_reference<T>::type>::type;
    void add(ArgType const& data);
};