我已经发布了这样的问题,但它没有提供最小,完整和可验证的示例。所以这就是:
//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表示一个唯一的值,在编译期间不是必须知道的
这就是我需要的原因