문제
이상한 오류가 발생합니다 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;
}
제휴하지 않습니다 StackOverflow