Единственный способ, которым я могу его скомпилировать, не выставляя предупреждение ни о каком члене a, когда T==B
и т. Д. Для T==A
равно reinterpret_cast
в пределах блоков if и доступа к не- поделились с помощью указателя. Нет ли способа обойти это или намекнуть на компилятор в противном случае?C++ template struct 'не имеет имени с именем' error
Это GCC 4.8.x
enum Type { A, B};
template<Type T> struct S { };
template<> struct S<A> { int x; int a; };
template<> struct S<B> { int y; int x; int b; };
template<Type T> static void foo(int x)
{
// lots of code
S<T> s;
s.x = someCall();
if (T == A)
{
s.a = 1;
}
else if (T == B)
{
s.y = 2;
s.b = 3;
}
// a bunch of common code
}
Edit: Я знаю о том, чтобы выделенные конкретных функции для обработки специфики, но я надеялся, чтобы избежать дополнительного кода шаблонного.
Я знаю об этом, я надеялся избавиться от кода плиты котла, если это возможно ... – stgtscc
Я думаю, что это _does_ устранит как можно больше плитки. Весь распространенный код хранится в шаблоне 'foo()', специфика в специальном 'bar''s – haavee
Интересно, если' std :: enable_if' или даже lambas? Слишком плохо, что компилятор обрабатывает код внутри if-statement как ошибку, очевидно, что пути, которые вызывают ошибку, оптимизированы в конце ... – stgtscc