C++ 11에서는 decltype을 사용하여 "복잡한"후행 반환 유형으로 선언 된 함수 템플릿을 어떻게 전문화 할 수 있습니까? GCC의 다음 작동하지만 "오류 C2912를 : 명시 적 전문성 'INT f를 (무효)가'함수 템플릿의 특수화 아니다"생산 VC2013에서 :decltype 후행 반환 유형이있는 특수 함수 템플릿
#include <iostream>
int myint() { return 1; }
template<class T>
auto f() -> decltype(myint()) // this seems to cause problems
{
std::cout << "general\n";
return 1;
}
template <>
auto f<double>() -> decltype(myint())
{
std::cout << "special\n";
return 2;
}
int main()
{
f<int>();
f<double>(); // compiler error in VC, but not in GCC
}
내가 "복잡한"말을 기술적으로 정확한 부족에 왜냐하면 나는 무엇이 차이를 만드는지 모르겠다. 예를 들어, 사용하여 다음 decltype, 내장 작업이 어떤 함수 결과 유형에 따라하지, 템플릿 특수화와 잘 작동 :
자동 F() - 그래서> decltype (1 + 1)
, 내 질문 (모두 서로 관련이 있음) :
- 내 코드가 올바른가요? C++ 11?
- 이것은 VC 버그입니까?
- 특수화의 종류가 작동하지 않는 경우 변경할 수없는 레거시 컨테이너 클래스에 대해 어떻게 std :: begin 및 std :: end (그래서 범위 기반 for 루프를 제공합니까?)를 전문으로 할 수 있습니까?
감사를 참조하십시오! 나는 여전히 C++ 11에서 std :: begin et al과 관련하여 실제로 관용적 인 것을 이해하려고 노력하고있다. 아마 나의 주요 관심사가 범위 기반 for 루프를 제공하는 것이라면, std :: begin/std :: end에 대해 너무 신경 쓰지 말고 독립적 인 비표준 begin/end 함수를 제공해야한다. –
@ChristianHackl 독립형'std :: begin()'과'std :: end()'는 예전의 C 스타일 배열 (예를 들어'int v [42];)에 유용하다. 이전 컨테이너를 새로운 범위 기반 for 루프로 작업하게하려면'my_container.begin()'과'my_container.end()'* member * 함수를 제공하면됩니다. 낡은 컨테이너를 바꿀 수 있다고 가정하고, 당신은 변함없이 쓰고 ... 흠. 또는 이전 코드를 변경할 필요가없는 이전 컨테이너에 대한보기를 정의 할 수 있습니다. 어떤 경우에는, 간단한 typedef가 충분하다면 typedef를 사용할 것이다. – Ali
같은 줄에 뭔가 생각 중입니다 ... LegacyContainerLoopAdapter는 LegacyContainer를 begin()/end() 멤버 함수로 래핑합니다. 하지만 std :: begin/std :: end는 또한 더 높은 수준의 일반화 된 것들에 대한 기본 연산처럼 유용 할 것입니다 (예 : bool empty (T const & c) {return std :: begin (c) = = std :: end (c);}). 그래서 나는 std :: begin과 std :: end를 전문화하는 것이 항상 최선의 방법이라고 생각했다. –