2017-02-04 2 views
0

여기이 클래스가 있습니다확실하지 왜지고있어 컴파일 오류

template<typename ClassType, std::size_t... Dims> 
class MatrixCell { 
private: 
    std::vector<std::size_t> coordinateIndices_; 
    ClassType data_; 

public: 
    MatrixCell() : coordinateIndices_{Dims...} {} 

    //template<typename ClassType, std::size_t... Dims> 
    void addItem(ClassType item, std::size_t... Dims) { 
     if (!checkIndex(Dims...)) { 
      std::ostringstream strStream; 
      strStream << __FUNCTION__ << " current index doesn't exist."; 
      Logger::log(strStream, Logger::TYPE_ERROR); 
      throw ExceptionHandler(strStream); 
     } else { 
      data_ = item; 
     } 
    } 

private: 
    //template<typename ClassType, std::size_t... Dims> 
    bool checkIndex(std::size_t... Dims) { 
     return true; 
    } 
}; 

그리고 나는이 컴파일러 오류 받고 있어요 :

1>------ Build started: Project: FileTester, Configuration: Debug Win32 ------ 
1> Matrix.cpp 
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(155): error C3543: 'std::size_t': does not contain a parameter pack 
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(171): note: see reference to class template instantiation 'MatrixCell<ClassType,Dims...>' being compiled 
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(168): error C3543: 'std::size_t': does not contain a parameter pack 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
}; 

오류 코드를 이해하는 데 문제가 없습니다. 정확히 무엇이 오류를 일으키는 지 이해하는 데 문제가 있습니다. 그리고 여러 가지를 시도한 곳에서 올바른 구문을 수정해야하는지 확실하지 않습니다.

나는 잘 여기에 표시된 데 모은 유사한 클래스가 있습니다
// DimensionPack & Helper Struct 
struct MatrixDimensionOddOrEven { 
    const unsigned int even_or_odd; 
    explicit MatrixDimensionOddOrEven(unsigned int odd_or_even) : even_or_odd(test(odd_or_even)) {} 

private: 
    const unsigned int test(unsigned int value) const { 
     if (value == 0) { 
      std::ostringstream strStream; 
      strStream << __FUNCTION__ << "invalid number: " << value << " must be >= 1."; 
      Logger::log(strStream, Logger::TYPE_ERROR); 
      throw ExceptionHandler(strStream); 
     } 
     return (((value % 2) == 0) ? EVEN : ODD); 
    } 
}; typedef MatrixDimensionOddOrEven MatDimOddEven; 

template <std::size_t... Dims> 
class DimensionPack { 
public: 
    std::vector<std::size_t> dimensions; 
    std::vector<unsigned int> even_or_odd; 
    const std::size_t total_dimensions = sizeof...(Dims); 
    const std::size_t total_elements = countElements(); 

public: 
    DimensionPack() : dimensions{Dims...}, 
     even_or_odd{ MatrixDimensionOddOrEven{Dims}.even_or_odd...} { 
    } 

private: 
    std::size_t countElements() { 
     std::size_t val = 1; // Don't Init to 0 otherwise multiplication won't work here! 
     for (std::size_t n = 0; n < dimensions.size(); n++) { 
      val *= dimensions.at(n); 
     } 
     return val; 
    } 
}; // DimensionPack 

그래서 올바른 방향으로 포인터가 매우 유용 할 것, 그리고 매우 이해할 수있을 것이다.

void addItem(ClassType item, decltype(Dims)... dims) { 
    if (!checkIndex(dims...)) { 

bool checkIndex(decltype(Dims)... dims) { 

불행히도 VC++이 컴파일 할 수 없습니다

+0

그래서 ... C++ (11) 또는 C++ (14)에 대한 질문은? 사양에 대한 태그를 포함하는 경우 하나만 사용하십시오. – tambre

+0

@tambre 또는 @tambre 중 하나 또는 ... VS2015 너무 variadic 서식 파일 및 해당 매개 변수 팩에 대한 문제가 안된다 그래서 사용하고 있습니다 ... –

+0

@ tambre 방금 일반 C++ 그대로 왼쪽 고정 –

답변

4

당신은 아마이 원하는. 아마도 컴파일러의 결함 일 것입니다. (표준에 대해 검증하지 않았지만 g ++과 clang 모두 컴파일합니다.) 다행히도 우리는 그 문제를 해결할 수 있습니다. 우리는 실제로 decltype을 필요로하지 않으며, std::size_t 상수 표현식을 필요로하고이를 무시하고 std::size_t을 반환합니다. 일정한 타입 레벨 함수와 같은 것. 이 같은

template <std::size_t> 
struct const_size_t 
{ 
    using type = std::size_t; 
}; 

및 사용 : 예를 들어

void addItem(ClassType item, typename const_size_t<Dims>::type... dims) 

Live demo

+0

그러나 내가 그걸 시도했을 때 당신의 대답을 좋아해. 'matrix.h (154) : error C3543 :'unknown-type ': 매개 변수 팩을 포함하지 않음. matrix.h (170) : 참고 : 클래스 템플릿 인스턴스화에 대한 참조'MatrixCell '컴파일 된 matrix.h (167) : 오류 C3543 :'unknown-type ': 매개 변수 팩을 포함하지 않습니다. –

+0

(... 계속) 템플릿 함수로 멤버 함수를 선언하려고했지만 동일한 컴파일러 오류를 생성합니다. –

+1

@FrancisCugler gcc와 clang으로 컴파일되며 vC++ 결함이어야합니다. 이 문제를 해결하려면 http : // rextester를 참조하십시오.co.kr/OXQM26187 –