У меня есть ошибка компиляции в следующем коде. Кажется, что компилятор интерпретирует метод класса set
как шаблон, который, на первый взгляд, совершенно не связан с моим кодом.
#include <cassert>
#include <limits>
using namespace std;
template <class T>
class ReduceScalar{
public:
T get() { return *r; };
void set(T t) { *r = t; };
void set(T* t) { r = t; };
private:
T* r;
};
template <class T>
class ReduceSum : public ReduceScalar<T>
{
public:
ReduceSum(T* target) { set(target); set(0); } // COMPILE ERROR
};
Компилятор выдает следующую ошибку:
../test/../io/scalarreducers.h:34:26: error: use of class template 'set' requires template arguments
ReduceSum(T* target) { set(target); set(0); }
Но я думаю, это потому, что он считает, что set
является шаблоном:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree:685:71: note: template is declared here
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY set;
Я не понимаю, почему компилятор пытается создать экземпляр этого шаблона для метода set
, а не просто вызвать метод set
. Как я могу решить эту путаницу имен?
using namespace std;
где-то, где этот код включен? - person πάντα ῥεῖ   schedule 01.05.2015this->set(target);
. - person lisyarus   schedule 01.05.2015set
и почему он предпочтительнее метода класса? - person Michael   schedule 01.05.2015std::set
- person πάντα ῥεῖ   schedule 01.05.2015std::set
, но какое именно правило определяет, интерпретируется лиset
какthis->set
илиstd::set
в моем случае? - person Michael   schedule 01.05.2015using namespace std;
. Базовый класс является зависимым, поэтому он не ищется, пока вы не сделаетеthis->set
. - person Brian Bi   schedule 01.05.2015