可能的Visual Studio c ++编译器错误?模板模板非类型参数的麻烦

时间:2014-07-31 21:27:29

标签: c++ templates c++11 compiler-bug

新问题

修改

此错误似乎与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编译器错误吗? 或者我的代码错了吗?

我在这里写了一个错误报告https://connect.microsoft.com/VisualStudio/feedback/details/933984/c-visual-studio-2013-compiler-bug-template-template-pointer-to-member-issue

如果这是一个错误,我怎么能让它工作?

感谢您的帮助。

旧问题

我遇到了一些有点复杂模板的问题&#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的第一个模板参数来解决问题?

感谢您的帮助。

0 个答案:

没有答案