此错误似乎与this one相同:
MSVC拒绝以下代码:
template <template <typename T, typename T::mytype x> class X>
struct z
{};
template <typename T, typename T::mytype xx>
struct x
{};
z<x> zz;
错误C3201:类模板的模板参数列表&#39; x&#39;与模板参数&#39; X&#39;
的模板参数列表不匹配但是类模板x与参数X具有相同的模板参数集。
地狱!此错误报告是从2012年4月开始的?!
用
状态:关闭为延期
:(
微软,我很失望TT
在我的情况下(下图),我可以通过自己的方式去做我想做的事,但这很难看:
//Library code
struct Boundary {
double sup, inf;
};
template <
class UserBoundaries,
template <size_t, bool...> class LocalInfo,
size_t hack>
struct Space_LocalParameters : LocalInfo<hack> {};
//User code
struct Boundaries_Problem7 {
Boundary b1, b2, b3;
};
template <size_t, bool...>
struct LocalInfo_Problem7 {};
template <size_t hack, bool... args>
struct Problem7_Functions
: Space_LocalParameters < Boundaries_Problem7, LocalInfo_Problem7, hack, args...> {};
int main() {}
使用:
//Compute the offset of member b2 in Boundaries_Problem7
const size_t hack = (size_t)(&((Boundaries_Problem7*)0)->b2);
if (...)
problem.functions[k].SetFunction(&Problem7_Functions<hack, true, false>::f);
else if (...)
problem.functions[k].SetFunction(&Problem7_Functions<hack, false, true>::f);
else problem.functions[k].SetFunction(&Problem7_Functions<hack, false, false>::f);
//Later in that function
if (boundary_Inf) {
value += this->points[0].coef
* ((Boundary*)((char*)&domain.boundaries + hack))->inf;
}
if (boundary_Sup) {
value += this->points[N-1].coef
* ((Boundary*)((char*)&domain.boundaries + hack))->sup;
}
编译器是否允许在优化期间更改成员的偏移量?
以下在http://coliru.stacked-crooked.com/a/be088e06861f9349
上编译正常//Library code
struct Boundary {};
template <
class UserBoundaries,
template <Boundary UserBoundaries::*> class LocalInfo,
Boundary UserBoundaries::*m_ptr>
struct Space_LocalParameters : LocalInfo<m_ptr> {};
//User code
struct Boundaries_Problem7 {
Boundary b1, b2, b3;
};
template <Boundary Boundaries_Problem7::*m_ptr>
struct LocalInfo_Problem7 {};
template <Boundary Boundaries_Problem7::*ptr>
struct Problem7_Functions
: Space_LocalParameters < Boundaries_Problem7, LocalInfo_Problem7, ptr> {}; // <-- C3201
int main() {}
但是visual studio 2013给了我这个错误:
错误C3201:类模板的模板参数列表&#39; LocalInfo_Problem7&#39;与模板参数&#39; LocalInfo&#39;的模板参数列表不匹配
这是VS编译器错误吗? 或者我的代码错了吗?
如果这是一个错误,我怎么能让它工作?
感谢您的帮助。
我遇到了一些有点复杂模板的问题&#34; typedef&#34;。
尽可能简化问题,我提出了这个问题:
template <class A, template <A*> class B, A* ptr>
struct Foo : B<ptr> {};
template <class, class AA, template <AA*> class BB, AA* ptr>
using Bar = Foo<AA, BB, ptr>; // <-- C3201
visual studio 2013给了我: 错误C3201:类模板的模板参数列表&#39; BB&#39;与模板参数&#39; B&#39;
的模板参数列表不匹配我不知道出了什么问题。
Foo<AA, BB, ptr>
&#34;扩展为&#34; template <class AA, template <AA*> class BB, AA* ptr> struct Foo : BB<ptr> {}
理论上,如果我们定义了以下内容(我实际上并没有尝试编译以下内容):
class MyClass {} myClass_instance;
template <MyClass*> class MyTemplateClass {};
然后
Bar<whatever, MyClass, MyTemplateClass, &myClass_instance>
应该是
的别名Foo<MyClass, MyTemplateClass, &myClass_instance> : MyTemplateClass<&myClass_instance>
这对我来说没问题。
奇怪的是,以下两个变体编译良好:
1 /使用template <A*>
template <AA*>
和template <Z*>
class Z;
template <class A, template <Z*> class B, A* ptr>
struct Foo : B<ptr> {};
template <class, class AA, template <Z*> class BB, AA* ptr>
using Bar = Foo<AA, BB, ptr>;
这种解决方法让我的程序运行正常,但这打败了我的模板方法的目的。
或2 /删除Bar的第一个模板参数
template <class A, template <A*> class B, A* ptr>
struct Foo : B<ptr> {};
template <class AA, template <AA*> class BB, AA* ptr>
using Bar = Foo<AA, BB, ptr>;
那么编译器提到的不匹配是什么?
如何删除Bar的第一个模板参数来解决问题?
感谢您的帮助。