我尝试让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
。
你知道什么是错的,我怎样才能使代码有效?
答案 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错误。