特征值在模板表达式中不可用

时间:2016-09-02 08:13:32

标签: c++ templates constants template-meta-programming traits

我已经发布了这样的问题,但它没有提供最小,完整和可验证的示例。所以这就是:

//static_const_with_template_specialization_test.h
#include <iostream>
enum class EnumFoo {A=10, B=20, C=30};
enum class EnumTest {D=40, E=50, F=60};

class MyStruct {};

template <EnumFoo enumFoo>
struct MyStructTraits
  {
  static const EnumTest MY_STATIC_CONST_VALUE;
  };

template <>
struct MyStructTraits<EnumFoo::A>
  {
  static const EnumTest MY_STATIC_CONST_VALUE;
  };


template<EnumTest genericEnumTest>
void fooTest()
  {
  std::cout << "generic fooTest\n";
  }

template<>
void fooTest<EnumTest::D>();

void anotherFunction(EnumTest test);


//static_const_with_template_specialization_test.cpp
#include "static_const_with_template_specialization_test.h"

template<>
void fooTest<EnumTest::D>()
  {
  std::cout << "EnumTest::D fooTest\n";
  }

template <EnumFoo type>
  const EnumTest MyStructTraits<type>::MY_STATIC_CONST_VALUE = EnumTest::F;


template <>
  const EnumTest MyStructTraits<EnumFoo::A>::MY_STATIC_CONST_VALUE = EnumTest::D;

void anotherFunction(EnumTest test)
  {
  std::cout << "anotherFunction\n";
  }

// main.cpp
int main()
  {
  fooTest<EnumTest::D>(); // ok
  fooTest<EnumTest::E>(); // ok
  anotherFunction(MyStructTraits<EnumFoo::A>::MY_STATIC_CONST_VALUE); // ok
  fooTest<MyStructTraits<EnumFoo::A>::MY_STATIC_CONST_VALUE>(); // Error here
  return 1
  }

问题是它无法编译:

main.cpp:31: error: no matching function for call to 'fooTest()'
   fooTest<MyStructTraits<EnumFoo::A>::MY_STATIC_CONST_VALUE>();

main.cpp:31: error: the value of 'MyStructTraits<(EnumFoo)10>::MY_STATIC_CONST_VALUE' is not usable in a constant expression
   fooTest<MyStructTraits<EnumFoo::A>::MY_STATIC_CONST_VALUE>();

你知道为什么我不能将该值用作常量表达式,如果它是常量吗?

在标题中写入所有内容都没有用,我得到了多个定义错误。

[编辑]用4.8.1编译

[Edit2]我想我已经解决了我的问题:

template <EnumFoo enumFoo>
struct MyStructTraits
  {
  //static const EnumTest MY_STATIC_CONST_VALUE;
  static constexpr EnumTest MY_STATIC_CONST_VALUE = EnumTest::F;
  };

template <>
struct MyStructTraits<EnumFoo::A>
  {
//  static const EnumTest MY_STATIC_CONST_VALUE;
  static  constexpr EnumTest MY_STATIC_CONST_VALUE = EnumTest::D;
  };

现在我需要明白为什么没有constexpr它就行不通。 我的实际代码中仍然存在一些“未定义的引用”问题。试图评估它们是否依赖于这个constexpr修复

[编辑3] 只是分享:

-constexpr表示一个不仅是常数的值,它在编译过程中是已知的。

-const表示一个唯一的值,在编译期间不是必须知道的

这就是我需要的原因

0 个答案:

没有答案