템플릿 매개 변수와 관련하여 템플릿 클래스에 [] 연산자를 오버로드하고 싶습니다. 그래서 같이 :C++ 템플릿 클래스 오버로드 [] 연산자
template<
typename T,
template<typename> class Property,
template<typename> class Key1,
template<typename> class Key2>
class a_map
{
public:
const Property<T>& operator[](const Key1<T>& k) const
{ return _values[k.index()]; }
const Property<T>& operator[](const Key2<T>& k) const
{ return _values[k.index()]; }
protected:
std::vector<Property<T> > _values;
};
그래서 같이이 클래스를 사용합니다 :
int main()
{
a_map<float, prop, key_a, key_b> pm;
}
는 기본적으로 나는
Key
유형에 대해 훨씬에 걱정하지 않고
_values
벡터 내부의 요소에 액세스 할 수 있어야합니다. 중요한 것은 회원이
index()
입니다.
그러나 나는
error C2535: 'const Property &a_map::operator [](const Key1 &) const' : member function already defined or declared
비록 key_a
및 key_b
이
이 totaly 다른 유형
클래스 템플릿입니다 다음과 같은 오류를 얻을.
내가 누락 된 항목이 있습니까? 컴파일러는 특정 상황에서 Key1<T>
과 Key2<T>
이 실제로 같은 유형 일 수 있음을 두려워합니까?
편집 이들은 내가 MVC++ 2008 컴파일러를 사용하고 편집 main
template<typename T>
struct prop
{
T weight;
T height;
};
template<typename T>
class key_a
{
public:
int index() { return _i; }
private:
int _i;
};
template<typename T>
class key_b
{
public:
int index() { return 3; } // Always return 3
에 사용되는 클래스 템플릿입니다.
'Key1'과'Key2'는 서로 다른 템플릿입니까? 'std :: vector'와'std :: list'를 테스트 등으로 시도해보십시오. –
'key_a'와'key_b' - 타입?당신의 선언에 따르면'key_a'와'key_b'는 타입이 아닌 class * templates *이어야합니다. 2, 3 및 4 번째 템플릿 매개 변수를 * template-template * 매개 변수로 선언했습니다. 따라서 * 템플릿 *을 인수로 지정해야합니다. 'key_a'와'key_b'가 단순히 * types * 인 경우, 당신의 코드는 컴파일되지 않습니다. 테스트에서'key_a'와'key_b'가 무엇인지에 대한 구체적인 예를 제공하십시오. – AnT
이것은 컴파일러 오류입니까, 링커 오류입니까? –