VS2015 C ++:无法将函数定义与现有声明匹配

时间:2015-11-29 08:42:17

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

我尝试让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<T_container>::nonconst_container与定义中的if [ -d $REPO_DIR ]; then echo "Updating to [$(REPO_VERSION)]"; git --git-dir=$(REPO_DIR)/.git --work-tree=$(REPO_DIR) fetch git --git-dir=$(REPO_DIR)/.git --work-tree=$(REPO_DIR) checkout $(REPO_VERSION) else echo "Cloning to [$(REPO_VERSION)]"; git --git-dir=$(REPO_DIR)/.git --work-tree=$(REPO_DIR) clone --branch $(REPO_VERSION) $REPO_ADDRESS $REPO_DIR 2> /dev/null; fi

你知道什么是错的,我怎样才能使代码有效?

1 个答案:

答案 0 :(得分:2)

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

MSVC似乎在类模板定义中匹配nonconst_container和在类外成员函数定义中匹配typename base_region<T_container>::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<T_container>::operator=之后的所有内容就像成员函数体中使用的名称一样(特别是,它首先会查看类成员),因此您只需编写nonconst_container和{{1很高兴回避MSVC错误。