如何在模板类型上强制保持一致性?

问题描述 投票:1回答:3
template<typename T> struct SomeClass{

    void someFunc(const T& data) const {}

};

void testFunc(const int* a) {

    SomeClass<int*> some_class;

    some_class.someFunc( a);

}

我制作了一个具有非const类型的模板实例。现在,当调用某个函数时,出现以下错误:

error: invalid conversion from ‘const int*’ to ‘int*’
note: initializing argument 1 of ‘void SomeClass<T>::someFunc(const T&) const [with T = int*]’

因此,基本上我的const T&被视为普通T&const被忽略。为什么?在这种情况下,如何确保编译器将其视为const T&

c++ templates const
3个回答
1
投票

您需要将定义更改为SomeClass<const int*> some_class;T来自定义,为int*,编译器在正确地抱怨。


1
投票

const不被忽略。将其应用于类型int*,产生无法修改的int*,即int* const。在const int*中,const适用于int,而不适用于指针。也就是说,const int*指向无法修改的int

testFunc内部,您最终得到both常量。由于它是用const int*调用的,因此SomeClass的特殊化必须为SomeClass<const int*>。然后,当您呼叫someFunc时,您得到第二个。实际参数类型为const int* const。第一个const适用于int,第二个const适用于参数本身,即指针。


0
投票

SomeClass是指针的情况,您可能要考虑部分专门化类模板T。然后,将const添加到所指向的类型,而不是指针本身(即指向const的指针而不是const指针):

template<typename T> struct SomeClass<T*> {
   void someFunc(const T* &data) const { /* ... */ } 
};

[SomeClass<int*>::someFunc()(即,T = int*)将被实例化为:

void someFunc(const int* &data) const;
data是对指向const int的指针的引用。但是,对于您的主模板,SomeClass<int*>::someFunc()实际上是:

void someFunc(int* const &data) const;

data在这里是对指向constint指针的引用。因此,不能将a(即const int*)作为someFunc()的参数传递,因为指向的const int可以通过参数data进行修改。换句话说,常数将丢失。
© www.soinside.com 2019 - 2024. All rights reserved.