2013-05-18 41 views
2

从我这里的其他问题Copying from std container frm arbitrary source object我设法让模板几乎在MSVC下工作。不幸的是,编译器崩溃,添加了一个构造函数来接受所有类型的std容器,而我的真实项目仍然在gcc中。现在,当我在gcc中使用此模板时,出现了几个我不知道如何解决的错误。模板类构造函数不工作

template <class T> class ReadOnlyIterator 
{ 
public: 
    template <typename V, typename U> 
    struct is_same 
    { 
     enum { value = 0 }; 
    }; 

    template <typename V> 
    struct is_same<V, V> 
    { 
     enum { value = 1 }; 
    }; 

    template <bool, typename> 
    struct enable_if 
    {}; 

    template <typename V> 
    struct enable_if<true, V> 
    { 
     typedef V type; 
    }; 

template <typename Container> 
    typename enable_if< 
    is_same<T, typename Container::value_type>::value, ReadOnlyIterator<T>&>::type operator= (const Container &v) 
    { 
     return *this; 
    } 

    template <typename Container> 
    ReadOnlyIterator(const Container &v, typename enable_if<is_same<T, typename Container::value_type>::value, void>::type * = 0) 
    { 
     mVector = v; 
     mBegin = mVector.begin(); 
    } 
}; 

我的目标是让分配是这样的:

std::vector<SimpleClass *>v; 
std::list<SimpleClass *>l; 
ReadOnlyIterator<SimpleClass *> t0 = v; 
ReadOnlyIterator<SimpleClass *> &t1 = v; 
ReadOnlyIterator<SimpleClass *> t2 = ReadOnlyIterator<SimpleClass *>(v); 
ReadOnlyIterator<SimpleClass *> t3 = l; 

t0 = v; 
t0 = l; 

我更新了上面的代码并恢复我申请了错误的变化。所以,现在我只能拿到原来的问题,我试图修复:

ReadOnlyIterator<SimpleClass *> &t1 = v; 

导致:

invalid initialization of reference of type 'ReadOnlyIterator<SimpleClass*>&' from expression of type 'std::vector<SimpleClass*, std::allocator<SimpleClass*> >' 
+1

请注意,在你之前的问题中,我使用'struct'而不是'class'作为助手('struct'默认情况下具有公共访问权限,'class'具有私有权限),并且我将它们命名为namespace-scope,而不是嵌套在'ReadOnlyIterator'中。 – Angew

+0

好的。我改回了它,但它仍然不起作用,因为我得到了与上面相同的错误。 – Devolus

+0

请参阅leemes的答案。您至少可以正确复制以前的答案。 – Angew

回答

1

正如你已经发现,如果在其他模板类中写一个模板类,你必须给模板参数不同的名称:

template <typename U, typename V> 
struct is_same<U, V> 
{ 
    enum { value = 0 }; 
}; 

is_same专业化,你必须使用同一类型指定专业类名称时,(你也可以将其命名为U,但使用相同的名称所有三个地方:在专业类名称在模板参数列表以及):

template <typename V> 
struct is_same<V, V> 
{ 
    enum { value = 1 }; 
}; 

另外,正如评论中提到的,你应该使这些帮助类struct而不是class;那么你不必写public:

1

我承担错误来自第二个声明,这简直就是非法的。您正在创建对非const的引用ReadOnlyIterator,因此您无法使用临时文件(例如由转换构造函数创建的文件)初始化该文件。如果您需要参考,请使用对const的引用。但你可能不需要一个。

第三声明:

ReadOnlyIterator<SimpleClass *> t2(v) = v; 

在语法上是错误的。

+0

感谢您指出,它应该是'\t ReadOnlyIterator t2 = ReadOnlyIterator (v);'和我在问题中解决了它。 – Devolus