шаблон c ++ и его тип элемента - PullRequest
2 голосов
/ 31 марта 2010

Это мой шаблон матрицы классов:

template<typename T>
class Matrix
{
public:
....
Matrix<T> operator / (const T &num);
}

Однако в моем классе Pixel я вообще не определял оператор Pixel / Pixel!

Почему в этом случае компилятор все еще компилируется?

Класс пикселей

#ifndef MYRGB_H
#define MYRGB_H

#include <iostream>
using namespace std;

class Pixel
{
public:
    // Constructors
    Pixel();
    Pixel(const int r, const int g, const int b);
    Pixel(const Pixel &value);
    ~Pixel();

    // Assignment operator
    const Pixel& operator = (const Pixel &value);

    // Logical operator
    bool operator == (const Pixel &value);
    bool operator != (const Pixel &value);

    // Calculation operators
    Pixel operator + (const Pixel &value);
    Pixel operator - (const Pixel &value);
    Pixel operator * (const Pixel &value);
    Pixel operator * (const int &num);
    Pixel operator / (const int &num);

    // IO-stream operators
    friend istream &operator >> (istream& input, Pixel &value);
    friend ostream &operator << (ostream& output, const Pixel &value);

private:
    int red;
    int green;
    int blue;
};

#endif

Ответы [ 2 ]

7 голосов
/ 31 марта 2010
Шаблоны

C ++ создаются в том месте, где вы их используете, и это также относится к Matrix<T>::operator/(const T&). Это означает, что компилятор разрешит Matrix<Pixel>, если только вы не вызовете оператор деления.

0 голосов
/ 31 марта 2010

1) Вы не предоставили тело оператора Matrix, поэтому возможно, что оператор Pixel / Pixel не нужен.

2) Afaik, методы шаблона не генерируют ошибки компиляции, если вы не вызываете их где-то в своем коде. НЕТ, если это стандарт или нет, но некоторые версии MSVC ведут себя так. У

Matrix m;
Pixel p;
m = m/p

где-нибудь в вашем коде, и посмотрите, что произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...