template <const long long int lx, const long long int ly, const long long int lz, const long long int cx, const long long int cy, const long long int cz> class rtH{
public: static const long long int sqlc=cx*cx+cy*cy+cz*cz;
static const long long int ldc=lx*cx+ly*cy+lz*cz;
};
template <const long long int lx, const long long int ly, const long long int lz, const long long int cx, const long long int cy, const long long int cz, const long long int r> class rt{
public: static const long long int d=rtH<lx,ly,lz,cx,cy,cz>::ldc-sqrt<rtH<lx,ly,lz,cx,cy,cz>::ldc*rtH<lx,ly,lz,cx,cy,cz>::ldc-(rtH<lx,ly,lz,cx,cy,cz>::sqlc-r*r),20>::value
;
};
int main(){return rt<1,1,1,1,1,1,1>::d;}
Компилятор не жалуется на создание экземпляра rt, поэтому он знает, что lx,ly,lz,cx,cy,cz,r являются константами времени компиляции. В rtH я определил sqlc и ldc как const. Эти константные переменные зависят только от констант времени компиляции, поэтому они должны быть также константами времени компиляции, верно? Если да, то почему компилятор жалуется на то, что параметр sqrt‹> не является константой времени компиляции?
Примечание: sqrt‹> работает и в других местах.
constexpr
вместоconst
. Кроме того, записьconst long long int
в качестве параметра шаблона смехотворно излишня. Напишите либоlong long
, либоstd::int64_t
(или напишите в другом местеusing std::int64_t
и сократите его доint64_t
). - person ALX23z   schedule 08.04.2020const
просто означает, что программа не может его модифицировать, и никоим образом не подразумевает время компиляции.constexpr
— это другое ключевое слово, которое при применении к переменной подразумевает константу времени компиляции. - person Zuodian Hu   schedule 08.04.2020