【问题标题】:VS2015 C++ : unable to match function definition to an existing declarationVS2015 C++:无法将函数定义与现有声明匹配
【发布时间】:2015-11-29 08:42:16
【问题描述】:

我尝试让 NCORR 库在 VS2015 C++ 上运行。该库最初是在 Linux 上编写的。

作为库的一部分,代码类似于

#include <chrono>

template<typename T_container>
struct container_traits {
    typedef typename T_container::container              nonconst_container;
};


template <typename T_container>
class base_region {
public:

    typedef typename container_traits<T_container>::nonconst_container nonconst_container;

    template<typename T_container2>
    typename std::enable_if<std::is_same<typename container_traits<T_container2>::nonconst_container, typename nonconst_container>::value, base_region&>::type operator=(const base_region<T_container2>&);
};

template <typename T_container>
template <typename T_container2>
typename std::enable_if<std::is_same<typename container_traits<T_container2>::nonconst_container, typename base_region<T_container>::nonconst_container>::value, base_region<T_container>&>::type base_region<T_container>::operator=(const base_region<T_container2>& reg) {
    return *this;
}


int main()
{
    return 0;
}

当我尝试在 VS2015 win32 控制台应用程序上编译代码时,我得到了

C2244   'base_region<T_container>::operator =': unable to match function definition to an existing declaration  ConsoleApplication5

我认为问题在于声明中的 typename nonconst_container 与定义中的 typename base_region&lt;T_container&gt;::nonconst_container

你知道哪里出了问题,我怎样才能让代码正常工作?

【问题讨论】:

  • 如果您在成员声明中删除typename nonconst_container 中的typename,这将在coliru 中与gccclang 一起编译。在VS2015中还是失败了,所以我认为它必须是编译器中的一个错误。
  • 好的,我会向微软报告。你能想到任何解决方法吗?

标签: c++ visual-studio templates visual-studio-2015


【解决方案1】:

首先,typename nonconst_container 格式不正确。 typename 只允许在限定名称之前。

MSVC 似乎在匹配类模板定义中的nonconst_container 和类外成员函数定义中的typename base_region&lt;T_container&gt;::nonconst_container 时存在问题。

一种解决方法(也更短)是使用 trailing-return-type

template <typename T_container>
template <typename T_container2>
auto base_region<T_container>::operator=(const base_region<T_container2>& reg)
  -> typename std::enable_if<std::is_same<typename container_traits<T_container2>::nonconst_container,
                                          nonconst_container>::value, base_region&>::type 
                                       // ^^^^^^^^^^^^^^^^^^          ^^^^^^^^^^^
{
   //...
}

base_region&lt;T_container&gt;::operator= 之后的所有内容都像在成员函数体中使用的名称一样被查找(特别是首先查找类成员),所以你可以只写nonconst_containerbase_region&amp;,并愉快地回避MSVC 错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2016-05-11
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多