나는 C++ 11로 작성된 과학적 코드를 연구 중이다. 이 코드의 중요한 작업은 3D 배열에서 수행됩니다. 이러한 배열은 다른 함수에도 많이 전달됩니다. 몇 가지 새로운 기능을 구현하는 동안 나는 템플릿을 사용하여 다음과 같은 문제를 겪었습니다. 코드는 gcc 5.4 (7.2 테스트)로 컴파일되지만 Intel C++ 컴파일러 ICC 16.0 (18.0 테스트)으로 컴파일되지 않습니다. 코드가 표준을 준수하지 않거나 해당 컴파일러 중 하나가 잘못 작동하는 경우 다음과 같이템플릿 함수의 배열 크기로 Constexpr (GCC vs Intel)
최소한의 예제 코드가 보인다 (실제로는 3 차원 배열 될 것이다) :
class Constants {
static constexpr int value_ = 2;
public:
static constexpr inline int V() { return value_; }
};
typedef Constants CC;
template<int N>
class Terror {
public:
template<class T>
void F(T (&a)[CC::V()]) {}
};
int main() {
int array[CC::V()];
Terror<42> ter = Terror<42>();
ter.F(array);
}
나는 constexpr
를 통해 결정 크기와 (3D) 일반 C 배열을 통과하기는 아니라는 것을 알고있다 고전적 접근법이지만, 내가 원할 경우 정교 할 수있는 이유가있다.
나는 C++ 11 표준을 통해 읽으려고했지만 내 문제에 대한 명확한 설명을 찾지 못했습니다. 이 (3D-) 표준 : 배열 작동 또는 두 개의 템플릿 중 하나는 N/T는 기존되지 않은 경우, 흥미롭게도
main.cpp(15): error: no instance of function template "Terror<N>::F [with N=42]" matches the argument list
argument types are: (int [2])
object type is: Terror<42>
ter.F(array);
^
template_class.h(10): note: this candidate was rejected because at least one template argument could not be deduced
void F(T (&a)[CC::V()]) {}
^
compilation aborted for main.cpp (code 2)
: 오류 ICC가 던지고있다
이있다.
인텔은 알고 있습니까? 그들은 이것을 고치는 길에 있습니까? – SamVanDonut
@SamVanDonut icc에 버그 리포트를 제출하는 방법을 모르겠습니다. – Barry