SFINAE tentou com bool dá erro do compilador: “argumento de modelo ‘T :: value’ envolve o parâmetro do modelo”

Eu tentei implementar um SFINAE usando bool (ao contrário do popular truque void_ ):

  template struct Resolve { static const bool value = false; }; template struct Resolve { static const bool value = true; }; 

O objective é se especializar, as classs que possuem static const bool my_value = true; definido dentro dela. Se eles forem definidos como false ou não definidos, não os especialize. ou seja

 struct B1 { // specialize Resolve for this case static const bool my_value = true; }; struct B2 { // don't specialize static const bool my_value = false; }; struct B3 {}; // don't specialize 

Ao aplicar o truque acima em B1 ele dá o erro de compilation:

 Resolve::value; 

erro: o argumento do modelo ‘T :: my_value’ envolve o (s) parâmetro (s) do modelo

Estou ciente de que isso pode ser conseguido de formas alternativas. No entanto, estou interessado em saber, por que dá erro de compilador aqui e pode ser resolvido neste código em si?

Na verdade, o que você está fazendo é proibido pela seção §14.5.4 / 9, que diz:

Uma expressão de argumento parcialmente não especializada não deve envolver um parâmetro de modelo da especialização parcial, exceto quando a expressão de argumento é um identificador simples.

O truque poderia ser usar um tipo para o segundo parâmetro de modelo, encapsulando o valor não-tipo , conforme descrito abaixo:

 template struct booltype {}; template > struct Resolve { static const bool value = false; }; template struct Resolve > { static const bool value = true; }; 

Agora compile multas .