Этот вопрос относится к моим последним one. Я пытаюсь решить проблему, используя traits<T>
и traits<T*>
. Пожалуйста, рассмотрите следующий код.Использование черт в C++
template<typename T>
struct traits
{
typedef const T& const_reference;
};
template<typename T>
struct traits<T*>
{
typedef const T const_reference;
};
template<typename T>
class test
{
public:
typedef typename traits<T>::const_reference const_reference;
test() {}
const_reference value() const {
return f;
}
private:
T f;
};
int main()
{
const test<foo*> t;
const foo* f = t.value(); // error here. cannot convert ‘const foo’ to ‘const foo*’ in initialization
return 0;
}
Так это выглядит как компилятор не рассматривает черты специализации для указателей и принимая тип возвращаемого из value()
в const foo
, а не const foo*
. Что я здесь делаю неправильно?
Любая помощь будет замечательной!
Я чувствую дамп :(Но сам T является указателем ('foo *'). Таким образом, указание 'T *' приведет к 'T **'? –
№. В 'traits' специализация 'T 'не является указателем,' T * 'является указателем. То, что вы используете один и тот же параметр, является несущественным. –
outis
ОК. Спасибо. Теперь это имеет смысл. –