최근에 연산자 오버로딩/템플릿 기능을 측정하려고 시도했으며 작은 테스트로 아래 컨테이너 클래스를 만들었습니다. 이 코드는 잘 컴파일되고 MSVC 2008 (디스플레이 11)에서 올바르게 작동하지만 MinGW/GCC와 Comeau는 모두 operator+
과부하로 질식합니다. 나는 MSVC 이상으로 그들을 신뢰하기 때문에, 내가 뭘 잘못하고 있는지 알아 내려고하고있다. 그 곳, 그래서템플릿이있는 클래스에서 이진 연산자 오버로드가 발생했습니다.
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 27: error: an explicit template argument list is not allowed
on this declaration
Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs)
^
1 error detected in the compilation of "ComeauTest.c".
내가 꼬모/MingGW가 볼을 플레이하려고 노력 힘든 시간을 보내고 있습니다 :
#include <iostream>
using namespace std;
template <typename T>
class Container
{
friend Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs);
public: void setobj(T ob);
T getobj();
private: T obj;
};
template <typename T>
void Container<T>::setobj(T ob)
{
obj = ob;
}
template <typename T>
T Container<T>::getobj()
{
return obj;
}
template <typename T>
Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs)
{
Container<T> temp;
temp.obj = lhs.obj + rhs.obj;
return temp;
}
int main()
{
Container<int> a, b;
a.setobj(5);
b.setobj(6);
Container<int> c = a + b;
cout << c.getobj() << endl;
return 0;
}
이 꼬모가 제공하는 오류는 다음과 같습니다
코드입니다 나는 너희들을 돌린다. 내 뇌가 C++ 구문의 무게로 많이 녹아 버렸기 때문에 오랜 시간이 걸렸으므로 좀 당혹 스럽다.).EDIT : 초기 Comeau 덤프에 나열된 (관련성이없는) lvalue 오류를 제거했습니다.
나는 연산자 +가 템플릿 기능이라고 생각 하나? 컨테이너 및 컨테이너 은 두 가지 유형이므로 컴파일러는 두 가지 다른 연산자 + 함수를 생성하여 처리해야합니다. 연산자 +가 템플릿 함수라는 것을 의미하지 않습니까? –
*는 * 기능 템플릿입니다. 그러나 템플리트의 정의에서 "<>"을 생략하는 것이 옳습니다. ("<>"는 함수 템플릿 *을 지정하여 *를 호출 할 때만 사용되며 동일한 이름의 템플릿이 아닌 함수가있는 경우에만 필요합니다.) –