2017-10-23 13 views
2

나는 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가 던지고있다

이있다.

답변

4

이것은 ICC 버그입니다.

template<int N> 
class Terror {  
    static constexpr size_t M = CC::V(); 
public: 
    template<class T> 
    void F(T (&a)[M]) {} 
}; 

ICC (16) 및 (17) 양이 변화 프로그램을 동의 :

다행히, 단지 Terror 내에서 그 값을 저장하는 아주 간단한 해결 방법은있다.

+0

인텔은 알고 있습니까? 그들은 이것을 고치는 길에 있습니까? – SamVanDonut

+0

@SamVanDonut icc에 버그 리포트를 제출하는 방법을 모르겠습니다. – Barry