문제

이상한 오류가 발생합니다 g++ 3.3 다음 코드에서 :

#include <bitset>
#include <string>

using namespace std;

template <int N, int M>
bitset<N> slice_bitset(const bitset<M> &original, size_t start) {
    string str = original.to_string<char, char_traits<char>, allocator<char> >();
    string newstr = str.substr(start, N);
    return bitset<N>(newstr);
}

int main() {
    bitset<128> test;
    bitset<12> result = slice_bitset<12, 128>(test, 0);
    return 0;
}

오류는 다음과 같습니다.

In function `std::bitset slice_bitset(const std::bitset&, unsigned int)':
syntax error before `,' token
`char_traits' specified as declarator-id
two or more data types in declaration of `char_traits'
`allocator' specified as declarator-id
two or more data types in declaration of `allocator'
syntax error before `>' token

정말 어리석은 것이 있어야하지만 이미 고무 오리와 친구에게 아무 소용이 없다고 말했습니다.

고마워, LazyWeb.

도움이 되었습니까?

해결책

선택한 답변 카더 위는 문제를 해결하지만 설명하지는 않습니다 문제를 해결합니다.

함수 템플릿이 구문 분석되면 종속 유형에서 조회가 발생하지 않습니다. 결과적으로 다음과 같은 구성을 구문 분석 할 수 있습니다.

template <typename T>
class B;

template <typename T>
void foo (B<T> & b) {
  // Use 'b' here, even though 'B' not defined
}

template <typename T>
class B
{
  // Define 'B' here.
};

그러나이 "기능"은 비용이 있으며,이 경우 'foo'의 정의는 템플릿 'b'의 내용에 대한 힌트를 요구한다는 것입니다. 'foo'가 중첩 된 유형의 'b'를 사용한다면 typename 키워드는 컴파일러에 이름이 유형임을 알리려면 다음과 같습니다.

template <typename T>
void foo (B<T> & b)
{
  typename B<T>::X t1;    // 'X' is a type - this declares t1
  B<T>::Y * t1;           // 'Y' is an object - this is multiplication
}

위의 '타입 이름'이 없으면 컴파일러는 X 객체 (또는 함수)입니다.

마찬가지로, 멤버 함수가 호출되고 호출에 명시적인 템플릿 인수가있는 경우, 컴파일러는 < 템플릿 인수 목록의 시작으로 연산자보다 적은 것이 아닙니다.

template <typename T>
void foo (B<T> & b)
{
  b.template bar<int> (0); // 'bar' is a template, '<' is start of arg list
  b.Y < 10;                // 'Y' is an object, '<' is less than operator
}

없이 template, 컴파일러는이를 가정합니다 < 연산자보다 적으므로 볼 때 구문 오류를 생성합니다. int> 그것은 표현이 아니기 때문입니다.

이 힌트가 필요합니다 조차 템플릿의 정의가 표시된 경우. 그 이유는 명백한 전문화가 나중에 실제로 선택된 정의를 변경할 수 있기 때문입니다.

template <typename T>
class B
{
  template <typename S>
  void a();
};

template <typename T>
void foo (B<T> & b)
{
  b.a < 10;            // 'B<int>::a' is a member object
}

template <>
class B<int>
{
  int a;
};

다른 팁

그냥 사용하십시오

original.to_string();

또는 실제로 유형 지정자가 필요한 경우

original.template to_string<char, char_traits<char>, allocator<char> >();

다음과 같은 편집 (GCC 3.4.4 사용) :

#include <bitset>
#include <string>

using namespace std;

template <int N, int M> 
bitset<N> slice_bitset(const bitset<M> &original, size_t start) 
{   
  string str = original.to_string();
  string newstr = str.substr(start, N);    
  return bitset<N>(newstr);
}

int main() 
{ 
  return 0; 
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top