Masz potrójny operator warunkowy, który w zasadzie ma zwracać wartość. Instrukcja break nie może nic zwracać dlatego wyskoczy błąd. Możesz zrobić tak, ale już lepiej skorzystać z if/else.
template <typename T, typename T2>
void maxn(T * ps, int n, T2 max)
{
bool exit = false;
max = ps[0];
for (int i = 0; i<n && !exit; i++)
(ps[i] > max) ? max = ps[i] : exit = true;
std::cout << max << std::endl;
}
W innej sytuacji kompilator w Visual Studio pozwoli na zamieszczenie dwóch wyrażeń o różnych zwracanych typach czyli np int i void (jako np funkcje) czego np clang czy gcc nie zrobi.