У меня возникла проблема со статическим элементом constexpr структуры шаблона. Код компилируется, но я получаю ошибку связывания. Вот что я пытаюсь сделать:Неопределенная ссылка, шаблон struct и constexpr static member
template<int n>
struct Test {
static constexpr auto invoke = make_tuple(2, "test", 3.4);
};
template<typename T>
void test(T&& t) {
cout << t << endl;
}
int main() {
test(get<0>(Test<2>::invoke));
return 0;
}
я получил связь ошибки с, так что я попытался это:
template<int n>
struct Test {
static constexpr auto invoke = make_tuple(2, "test", 3.4);
};
// declare it outside the class
template<int n>
constexpr decltype(Test<n>::invoke) Test<n>::invoke;
template<typename T>
void test(T&& t) {
cout << t << endl;
}
int main() {
test(get<0>(Test<2>::invoke));
return 0;
}
Но вместо этого я получил эту странную ошибку:
error: redefinition of 'invoke' with a different type: 'const decltype(Test<n>::invoke)' vs 'const std::tuple<int, const char *, double>'
Другой тип? Очевидно, что версия не-шаблон работает просто отлично:
struct Test {
static constexpr auto invoke = make_tuple(2, "test", 3.4);
};
constexpr decltype(Test::invoke) Test::invoke;
template<typename T>
void test(T&& t) {
cout << t << endl;
}
int main() {
test(get<0>(Test::invoke));
return 0;
}
Как я могу узнать версию шаблона для работы? Большое спасибо
Я добавил C++ 14, так как 'make_tuple' не является constexpr до тех пор. –