我有一个类,它获取两个模板模板参数,并使用一个参数重载一个函数,该参数是一个或另一个模板模板参数,但两次都使用相同的模板参数:
template<template<typename> class TemplArgA, template<typename> class TemplArgB>
class CompileError {
public:
void func(TemplArgA<int> x) {}
void func(TemplArgB<int> x) {}
};
我正在使用 VC2010 并得到
error C2535: 'void CompileError<TemplArgA,TemplArgB>::func(TemplArgA<int>)': member function already defined or declared
编译上述代码示例时(甚至不在模板实例化时,只是在代码中包含上述行就已经导致编译错误)。
相比之下,这些编译得很好:
template<class TemplArgA, class TemplArgB>
class Compiles {
public:
void func(TemplArgA x) {}
void func(TemplArgB x) {}
};
template<template<typename> class TemplArgA, template<typename> class TemplArgB>
class AlsoCompiles {
public:
void func(TemplArgA<int> x) {}
void func(TemplArgB<double> x) {}
};
知道我做错了什么吗?
似乎用 clang++ 编译得很好,所以我想知道这是否可能是 VC2010 中的一个错误...如果是这样:知道如何解决它吗?
没得选,必须用VC2010:(
如果是这样:知道如何解决这个问题吗?
所以,你可以尝试
template<template<typename> class TemplArgA, template<typename> class TemplArgB>
class CompileError {
public:
void func(TemplArgA<int> x) {}
void func(TemplArgB<int> x,void* workaround = 0) {}
当然,这并不严格等同于您的原始代码(因为在 TemplArgA==TemplArgB 情况下的函数实例化之前您不会收到错误;我不知道这是否与您相关)
但在真实的代码中,我不仅有 TemplArgA 和 TemplArgB,还有 4 个模板模板参数(比如 TemplArgA 到 TemplArgD)——我不认为我可以应用解决方法?
你只需要说服编译器这些重载是不等价的:
template<int> struct workaround_t{};
void func(TemplArgA<int> x, workaround_t<0>* workaround = 0) {}
void func(TemplArgB<int> x, workaround_t<1>* workaround = 0) {}
void func(TemplArgC<int> x, workaround_t<2>* workaround = 0) {}
//...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)