2015-01-18 15 views
5

Bạn có thể sử dụng từ khóa template khi nhận được một tên mẫu từ một namespace toàn cục:Có lý do nào để sử dụng ":: mẫu" không?

template <class T> void function_template(); 

template <class T> 
void h() 
{ 
    ::template function_template<T>(); 
} 

int main() { h<int>(); } 

Nhưng mã này có thể biên dịch mà không có nó. Các tình huống trong đó người ta có thể muốn làm điều này là gì?

+0

@KerrekSB Nhưng 'function_template' là thành viên của không gian tên * toàn cục * và mã này có thể biên dịch mà không có nó. –

+0

Ồ, xin lỗi, ý của bạn là phiên bản toàn cầu - đừng bận tâm. –

Trả lời

8

tôi có thể nghĩ đến một nơi, nhưng tôi hầu như không nghĩ rằng nó sẽ được phổ biến:

#include <iostream> 

// simpile function template 
template<class T> 
void function_template(T) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

// overload (NOT specialized) 
void function_template(int value) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

int main() 
{ 
    function_template(0);    // calls overload 
    ::function_template(0);    // calls overload 
    ::template function_template(0); // calls template, deduces T 
} 

Output

void function_template(int) 
void function_template(int) 
void function_template(T) [T = int] 

tôi sẽ nhét một số điều này trong một không gian tên vô danh đến thực sự mang ý nghĩa không tầm thường đến :: nhưng điều này có vẻ là đủ nên tôi đã bỏ nó ra.

+0

[temp.names]/p5 nói "Tên được đặt trước bởi từ khóa' mẫu' sẽ là * mẫu-id * hoặc tên sẽ tham chiếu đến một mẫu lớp. " ':: template function_template' là không, do đó, nó sẽ được hình thành không đúng. –

Các vấn đề liên quan